1

我一直在研究锁树死锁检测算法的一些示例,但无法弄清楚在这种特殊情况下死锁是如何发生的:

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:E - D,因为线程以相反的顺序获取这些锁?

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

4

2 回答 2

2

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

于 2012-10-30T21:17:49.337 回答
1

线程 1 执行:lock(a)、lock(c)、unlock(c)、lock(b)、lock(d)

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

线程 2 执行:lock(e), lock(d)

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

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

现在他们被困住了——

1 正在等待 2 解锁 e.

2 正在等待 1 解锁 d

避免这种情况的方法之一是立即锁定您需要的所有内容,而不是作为单独的操作。

于 2012-08-12T18:04:53.267 回答