程序在c ++ 11中使用条件变量进入死锁状态

时间:2018-04-14 07:07:04

标签: c++ multithreading c++11 mutex condition-variable

我目前正在尝试学习如何使用condition_variable进行线程同步。为了测试,我已经制作了如下所示的演示应用程序。当我启动它时,它会陷入死锁。我知道发生这种情况的位置,但我无法理解为什么发生死锁。

我知道condition_variable的{​​{1}}函数会在条件不为真时自动解锁互斥锁,因此不应在第二遍中阻塞主线程。但正是这种情况发生了。

有人可以解释原因吗?

wait

2 个答案:

答案 0 :(得分:2)

  

我知道condition_variable的等待函数会在条件不成立时自动解锁互斥锁。

嗯...,是的......,为了绝对清楚,cv.wait(lck, f)这样做:

while(! f()) {
    cv.wait(lck);
}

每次拨打cv.wait(lck)都会;

  • 解锁lck
  • 等到其他线程调用cv.notify_one()cv.notify_all()
  • 重新锁定lck,然后
  • 返回。

答案 1 :(得分:1)

您可以通过在while循环中移动unique_lock(...)语句来解决问题。就像现在一样,你试图在第2轮解锁lck,但它没有处于锁定状态,因为在第1轮后你再也没有锁定它。