当与std :: conditional_variable :: wait()一起使用时,std :: unique_lock的作用是什么

时间:2013-10-24 15:03:42

标签: c++ visual-c++ c++11

在等待std::unique_lock时,我对std::conditional_variable的需求感到困惑。所以我查看了VS 2013中的库代码并且更加困惑。这就是std::conditional_variable::wait()实施的方式:

void wait(unique_lock<mutex>& _Lck)
    {   // wait for signal
    _Cnd_waitX(&_Cnd, &_Lck.mutex()->_Mtx);
    }
这是一种玩笑吗?在一个unique_lock中包装一个互斥锁,什么也不做,只能把它拿回来?为什么不在参数列表中使用互斥?

2 个答案:

答案 0 :(得分:3)

我们的想法是,当您调用wait时,您希望在某个变量的值发生变化时发出信号(因此condition_variable)。现在,由于您从多个线程访问有问题的变量(否则您不需要同步),它可能会受到互斥锁的保护。因此,当您等待变量更改时,您必须放弃互斥锁,当您收到信号时,您必须重新获取它。这就是这个功能为你做的。

答案 1 :(得分:0)

问题是当你在发出信号后醒来时,你需要锁定互斥锁。如果您在通过信号唤醒后尝试锁定互斥锁,则会出现竞争状况。在另一方面等待条件变量无法自动锁定该互斥锁,因为它无法正确地向您返回锁定,并且通常您应该在进入等待之前锁定互斥锁。