主题1:
putQ
setFlag
主题2:
while (1) {
waitFlag
processQ
clearFlag
}
这是一个面试问题。我不确定Thread 1是否有while循环。 但答案就是当线程2重新进入while循环时,两个线程进入死锁状态。
谁能告诉我死锁的条件是什么?感谢。
答案 0 :(得分:0)
我看到的一个有问题的场景是线程1(T1
)在短时间内两次调用有问题的代码。这是一个可能的行动方案:
T2: waitFlag
T1: putQ
T1: setFlag
T2: processQ
T1: putQ
T1: setFlag
T2: clearFlag
如果T1
再也没有将任何内容放入队列,T2
将永远不会处理第二项。但这不是僵局。
答案 1 :(得分:0)
假设第一个块周围有一个循环,我相信这个例子试图引起人们注意计数信号量的重要性。示例中的“标志”不计数,因此多次通过第一个循环会将多个项目放入队列,但标志只能“设置”一次,因此第二个循环只能触发一次。对于上部循环中的每个V
,信号量将计数一次,以便第二个循环可以根据需要运行多次,同时使用P
减少计数。
答案 2 :(得分:0)
我认为OP的评论是正确的:
@Gray :这很可能不是死锁,而是竞争条件。然而,应用程序卡住了没有处理队列,所以它是一个锁定。
@Wug :可能是“琐碎的情况”,当thread 1
放入队列并更新标志时,thread 2
将永远不会注意到。请参阅下面的行动方案。
潜在锁定情况:
ProcessQ
元素0(处理前一个元素)PutQ
元素1 SetFlag
ClearFlag
waitFlag
元素1可能永远不会被处理。
修改强>
当然,下一个问题是:how do you fix that?
答案是使用Conditional Variable
(有关详细信息,请参阅pthread_cond_init
和其他人):
主题1:
PutQ
LockMutex
SetFlag
CondSignal
UnlockMutex
主题2:
while (1) {
LockMutex
while (FlagIsUnset)
CondWait
FlagUnset
UnlockMutex
ProcessQ
}