使用POSIX条件变量,您将编写如下内容:

while (!_doneWaiting) {
    wait(lock);
}

起初,当我看到新的C++ 11样式时,我很兴奋:
unique_lock<recursive_mutex> g(_consumerCondLock);
_consumerCond.wait( g, [this]() {
    return _doneWaiting;
} );

但是让我烦恼的是:上面的谓词lambda是否保证在发生任何等待之前运行一次?

最佳答案



您必须检查的等待条件:

  • 在等待条件变量之前。
  • 由于spurious wakeups等待条件变量后。

  • 这就是为什么等待条件变量的规范形式是while循环的原因:
    // lock the mutex
    while(!condition)
        // wait on the condition variable
    

    这是std::condition_variable::wait为您服务的。

    请注意,大多数时候您都希望使用std::condition_variable而不是std::condition_variable_any。后者维护自己的互斥体,并且在内存和运行时方面更昂贵。

    关于c++ - std::condition_variable_any是否具有笨拙的语义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24411856/

    10-12 00:37
    查看更多