2

有向グラフの原子性と分離の保証はどこにでも記載されていますか?

特に:

  1. del_vertex の途中で別のプロセス (vertices()、out_neighbours() など) にアクセスしようとした場合、別のプロセスは digraph をどのような状態で参照しますか?エッジは削除され、頂点は削除されない) または del_vertex の後 (つまり、操作が終了するまで別のプロセスがブロックされる)?
  2. del_vertices に関する同じ質問。

私の理解が正しければ、ダイグラフは3つのetsテーブルを使用して実装されています。結果を一貫させるために、それらの間に追加のロックメカニズムはありますか?

4

1 に答える 1

4

digraph.erl のソースを見ると、余分なロックが行われていないことがわかります。

del_vertex(G, V) ->
    do_del_vertex(V, G).

...

do_del_vertex(V, G) ->
    do_del_nedges(ets:lookup(G#digraph.ntab, {in, V}), G),
    do_del_nedges(ets:lookup(G#digraph.ntab, {out, V}), G),
    ets:delete(G#digraph.vtab, V).

したがって、別のプロセスからダイグラフを見ると、タイミングに応じて次の状態が表示されます。

  • の前のすべてdel_vertex/2
  • 頂点との間の一部のエッジが削除されました
  • 頂点自体が削除されました

の頂点の後に同じことが起こりdel_vertices/2ます。

より原子性が必要な場合は、ダイグラフprotectedを作成し、それを独自のサーバーにラップします。たとえば、gen_server通常、ダイグラフへのアクセスが必要な機能の一部を実装します。

于 2011-04-03T18:17:58.213 に答える