线程 1:
putQ
setFlag
话题二:</p>
while (1) {
waitFlag
processQ
clearFlag
}
这是一道面试题。我不确定线程1是否有while循环。但答案就像线程2重新进入while循环时,两个线程进入死锁。
谁能告诉我死锁的条件是什么?谢谢。
线程 1:
putQ
setFlag
话题二:</p>
while (1) {
waitFlag
processQ
clearFlag
}
这是一道面试题。我不确定线程1是否有while循环。但答案就像线程2重新进入while循环时,两个线程进入死锁。
谁能告诉我死锁的条件是什么?谢谢。
我看到的一个有问题的场景是线程 1 ( T1
) 在短时间内两次调用有问题的代码。这是一个可能的行动方案:
T2: waitFlag
T1: putQ
T1: setFlag
T2: processQ
T1: putQ
T1: setFlag
T2: clearFlag
如果T1
不再将任何内容放入队列,T2
则永远不会处理第二个项目。但这不是僵局。
假设第一个块周围有一个循环,我相信这个例子试图引起人们注意信号量计数的重要性。示例中的“标志”不计算在内,因此多次通过第一个循环将多个项目放入队列中,但标志只能“设置”一次,因此第二个循环只能触发一次。信号量将在上层循环中为每个循环计数一次,V
这样第二个循环将根据需要运行多次,同时减少计数P
。
我认为OP的评论是正确的:
@Gray:这很可能不是死锁,而是竞争条件。然而,应用程序被卡住而不处理队列,所以它是一个锁。
@Wug:这可能是“微不足道的情况”,虽然thread 1
已经放入队列并更新了标志,但thread 2
永远不会注意到。请参阅下面的行动方案。
潜在的锁定情况:
ProcessQ
元素 0(处理前一个元素)PutQ
元素 1SetFlag
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
}