在等待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中包装一个互斥锁,什么也不做,只能把它拿回来?为什么不在参数列表中使用互斥?
答案 0 :(得分:3)
我们的想法是,当您调用wait
时,您希望在某个变量的值发生变化时发出信号(因此condition_variable
)。现在,由于您从多个线程访问有问题的变量(否则您不需要同步),它可能会受到互斥锁的保护。因此,当您等待变量更改时,您必须放弃互斥锁,当您收到信号时,您必须重新获取它。这就是这个功能为你做的。
答案 1 :(得分:0)
问题是当你在发出信号后醒来时,你需要锁定互斥锁。如果您在通过信号唤醒后尝试锁定互斥锁,则会出现竞争状况。在另一方面等待条件变量无法自动锁定该互斥锁,因为它无法正确地向您返回锁定,并且通常您应该在进入等待之前锁定互斥锁。