使用POSIX条件变量,您将编写如下内容:
while (!_doneWaiting) {
wait(lock);
}
起初,当我看到新的C++ 11样式时,我很兴奋:
unique_lock<recursive_mutex> g(_consumerCondLock);
_consumerCond.wait( g, [this]() {
return _doneWaiting;
} );
但是让我烦恼的是:上面的谓词lambda是否保证在发生任何等待之前运行一次?
最佳答案
您必须检查的等待条件:
这就是为什么等待条件变量的规范形式是
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/