锁树算法死锁检测

时间:2012-08-12 17:56:46

标签: algorithm tree locking deadlock detection

我一直在研究Lock tree死锁检测算法的一些例子,并且无法弄清楚在这种特殊情况下如何发生死锁:

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)

根据我的理解,Lock树看起来应该是这样的:

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

可能是在节点T1处发生死锁:D - E和T2:E - D,因为线程以相反的顺序获取这些锁吗?

我怎么能建议插入一个锁和一个解锁语句来消除死锁?

2 个答案:

答案 0 :(得分:0)

线程1执行:锁定(a),锁定(c),解锁(c),锁定(b),锁定(d)

所以现在a,b和d被锁定

线程2:锁定(e),锁定(d)

所以现在e也被锁定,线程2正在等待d解锁

现在线程一个醒来并执行:lock(e)

现在他们被卡住了 -

1等待2解锁e。

2等待1解锁d

避免这种情况的方法之一是一次锁定所需的一切,而不是单独的操作。

答案 1 :(得分:0)

是的,在T2中锁定(E)之前锁定(B)将防止死锁。这称为门锁。