2012-08-12 104 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)将防止死锁。这被称为门锁。