2011-04-02 22 views
2

是否在任何地方描述有向圖原子性和隔離保證?Erlang有向圖原子性和隔離保證

特別:

  1. 哪種狀態將另一個進程看有向圖中,如果另一個進程試圖訪問它(頂點(),out_neighbours()等)在del_vertex中間:del_vertex之前,在中間的del_vertex(即頂點被刪除,邊緣不被刪除或邊緣被刪除,頂點不是)或del_vertex後(即另一個進程將被阻止,直到操作結束)?
  2. 關於del_vertices的相同問題。

如果我理解正確,則使用3個ets表實施有向圖。它們之間是否還有其他鎖定機制以保持一致?

+0

順便說一句:你有兩個不相連的帳戶,一個聲望爲11,這個聲譽爲6.你應該考慮註冊,如果你想從不同的計算機使用SO。 – 2011-04-03 18:25:46

回答

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通常實現需要密切訪問有向圖的功能的一部分。