0

我对需要 a std::unique_lockwhen wait a感到很困惑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 中,然后什么都不做,只是稍后将其取回?为什么不在参数列表中使用互斥锁?

4

2 回答 2

3

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

于 2013-10-24T15:08:33.503 回答
0

问题是当您在收到信号后醒来时,您需要已经锁定互斥锁。如果您在通过信号唤醒后尝试锁定互斥锁,您将获得竞争条件。另一方面,等待条件变量本身无法锁定该互斥锁,因为它无法正确地向您返回锁定,并且通常您应该在进入等待之前锁定互斥锁。

于 2013-10-24T15:50:50.683 回答