und*_*ind 5 c++ multithreading condition-variable c++11 spurious-wakeup
如果std::condition_variable由于虚假的唤醒可以发出信号(我们无法确定我们需要的条件是否真的满足),为什么C++标准库提供wait()没有谓词的方法的重载?可以使用此类行为的情况是什么?
假设复杂的条件:A || B.当条件的某些部分为真时,应采取适当的行动,actionA或者actionB应该执行.
使用谓词版本,可以遵循代码(predAB()评估条件):
cond.wait(lock, predAB);
if(A) {
actionA();
}
else {
actionB();
}
Run Code Online (Sandbox Code Playgroud)
但是非谓词等待的代码可能会更快:
while(true)
{
if(A) {
actionA();
break;
}
else if(B) {
actionB();
break;
}
cond.wait(lock);
}
Run Code Online (Sandbox Code Playgroud)
注意,与第一个变体不同,现在每个条件部分都被评估一次.
当条件不能写入一个表达式时,有更复杂的情况.
| 归档时间: |
|
| 查看次数: |
788 次 |
| 最近记录: |