1

线程 1:

putQ
setFlag

话题二:</p>

while (1) {
waitFlag
processQ
clearFlag
}

这是一道面试题。我不确定线程​​1是否有while循环。但答案就像线程2重新进入while循环时,两个线程进入死锁。

谁能告诉我死锁的条件是什么?谢谢。

4

3 回答 3

0

我看到的一个有问题的场景是线程 1 ( T1) 在短时间内两次调用有问题的代码。这是一个可能的行动方案:

  • T2: waitFlag
  • T1: putQ
  • T1: setFlag
  • T2: processQ
  • T1: putQ
  • T1: setFlag
  • T2: clearFlag

如果T1不再将任何内容放入队列,T2则永远不会处理第二个项目。但这不是僵局。

于 2012-10-03T19:02:23.073 回答
0

假设第一个块周围有一个循环,我相信这个例子试图引起人们注意信号量计数的重要性。示例中的“标志”不计算在内,因此多次通过第一个循环将多个项目放入队列中,但标志只能“设置”一次,因此第二个循环只能触发一次。信号量将在上层循环中为每个循环计数一次,V这样第二个循环将根据需要运行多次,同时减少计数P

于 2012-10-03T19:06:20.200 回答
0

我认为OP的评论是正确的:

  1. @Gray:这很可能不是死锁,而是竞争条件。然而,应用程序被卡住而不处理队列,所以它是一个锁。

  2. @Wug:这可能是“微不足道的情况”,虽然thread 1已经放入队列并更新了标志,但thread 2永远不会注意到。请参阅下面的行动方案。

潜在的锁定情况:

  • T2:ProcessQ元素 0(处理前一个元素)
  • T1:PutQ元素 1
  • T1:SetFlag
  • T2:ClearFlag
  • T2: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
}
于 2012-10-03T19:30:58.627 回答