与 std::conditional_variable::wait() 一起使用时 std::unique_lock 的工作是啥 [重复]

Posted

技术标签:

【中文标题】与 std::conditional_variable::wait() 一起使用时 std::unique_lock 的工作是啥 [重复]【英文标题】:what's the job of std::unique_lock when used with std::conditional_variable::wait() [duplicate]与 std::conditional_variable::wait() 一起使用时 std::unique_lock 的工作是什么 [重复] 【发布时间】:2013-10-24 15:03:42 【问题描述】:

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

void wait(unique_lock<mutex>& _Lck)
       // wait for signal
    _Cnd_waitX(&_Cnd, &_Lck.mutex()->_Mtx);
    

这是在开玩笑吗?将互斥锁包装在 unique_lock 中,然后什么都不做,只是稍后将其取回?为什么不在参数列表中使用互斥锁?

【问题讨论】:

您可能想阅读这个问题***.com/q/2763714 它是特定于 pthread 的,但也适用于这种情况。 【参考方案1】:

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

【讨论】:

如果该变量是原子类型怎么办? 这是个好问题。我没有答案。 @Mike:你仍然需要互斥锁。修改状态可能是原子的;但是您需要原子的操作是“修改和通知”和“测试和等待”。否则,如果在您检查值之后但在您开始等待之前发生通知,您可能会一直等待。【参考方案2】:

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

【讨论】:

你能解释一下你的意思是什么比赛条件吗?

以上是关于与 std::conditional_variable::wait() 一起使用时 std::unique_lock 的工作是啥 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

=与==&与&&| 与 || 的区别

与 0 进行比较与与某个值进行比较是不是更快?

三.工具与市场-债券与债务股票与公司

RESTfulREST 与 RESTful 理解与实践

RESTfulREST 与 RESTful 理解与实践

RESTfulREST 与 RESTful 理解与实践