2012-08-12 103 views
0

我一直工作在鎖樹死鎖檢測算法的一些例子,並一直無法找出死鎖在這種特殊情況是如何發生的:鎖樹算法死鎖檢測

Thread 1:   Thread 2: 

lock(A)    lock(E) 
lock(C)    lock(D) 
unlock(C)   unlock(D) 
lock(B)    unlock(A) 
lock(D)    lock(A) 
lock(E)    lock(C) 
unlock(E)   unlock(C) 
unlock(D)   unlock(A) 
unlock(B) 
unlock(A) 

從我的理解鎖定樹應該是這個樣子:

T1:   T2: 
      /\ 
    A   E A 
/\   | | 
C B  D C 
    | 
    D 
    | 
    E 

難道是發生死鎖在節點T1:d - E和T2:電子 - d,因爲線程採取相反的順序這些鎖?

我怎麼能建議插入一個鎖和一個解鎖語句來消除死鎖?

回答

0

線程1的作用:鎖(a)中,鎖(c)所示,解鎖(c)中,鎖(b)中,鎖(d)

所以現在a,b和d被鎖定

螺紋2的作用:鎖(e)中,鎖(d)

所以現在e爲鎖定以及和線程2正在等待d解鎖

現在線程一個喚醒並確實:鎖(E)

現在它們被卡住了 -

1正在等待2解鎖e。

2等待1解鎖d

的方法之一,以避免這一點就是鎖定你需要在一次的一切,而不是作爲單獨的操作。

+0

哦,我現在看到它!謝謝。不過,我還有一個問題。如果我添加了T2:** lock(b)**,lock(e),lock(d),我能夠避免發生死鎖嗎?大概是 – Maputo 2012-08-13 08:51:30

+0

。困難的部分不是避免死鎖,而是允許線程並行運行,同時避免死鎖。另外,您可以在創建之前鎖定線程1,直到線程2完成 – Gir 2012-08-13 16:09:22

0

是的,在T2鎖定(E)之前鎖定(B)將防止死鎖。這被稱爲門鎖。