多线程死锁

时间:2012-10-03 18:57:48

标签: multithreading deadlock

主题1:

putQ
setFlag

主题2:

while (1) {
waitFlag
processQ
clearFlag
}

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

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

3 个答案:

答案 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的评论是正确的:

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

  2. @Wug :可能是“琐碎的情况”,当thread 1放入队列并更新标志时,thread 2将永远不会注意到。请参阅下面的行动方案。

  3. 潜在锁定情况:

    • 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
    }