我一直在研究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,因为线程以相反的顺序获取这些锁?
我如何建议插入一条lock和一条unlock语句来消除死锁?
发布于 2012-08-13 02:04:53
线程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-10-31 05:17:49
是的,在T2中,先锁(B)再锁(E)可以防止死锁。这被称为门锁。
https://stackoverflow.com/questions/11924436
复制相似问题