c++ - 什么时候可以在没有谓词的情况下使用 std::condition_variable?

标签 c++ multithreading c++11 condition-variable spurious-wakeup

如果 std::condition_variable 可以由于虚假唤醒而发出信号(并且我们不能确定我们需要的条件是否真的得到满足),为什么 C++ 标准库提供重载没有谓词的 wait() 方法?什么场景可以使用这种行为?

最佳答案

假设一个复杂条件:A || B。当条件的任何部分为真时,应执行适当的操作,actionAactionB

使用predicate版本,代码如下:

cond.wait(lock, []{return (A || B);});
if(A) {
    actionA();
}
else {
    actionB();
}

但如果使用非谓词等待,代码可能更快:

while(true)
{
    if(A) {
         actionA();
         break;
    }
    else if(B) {
         actionB();
         break;
    }
    cond.wait(lock);
}

请注意,与第一个变体不同,现在每个条件部分都被评估一次。

还有更复杂的情况,条件不能写在单个表达式中。

关于c++ - 什么时候可以在没有谓词的情况下使用 std::condition_variable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35012826/

相关文章:

c++ - 字符串未正确复制并显示错误: cannot convert 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}'

c++ - 在工作线程创建新 GUI 元素的地方使用 Qt

c# - 主窗口关闭时如何重新创建 Windows 窗体应用程序

c++ - 如果大括号闭合列表的类构造函数大小错误,则编译时错误

c++ - 将函数模板转换为模板仿函数

c++ - 将 future 存储在列表中

c++ - boost::interprocess 互斥量和条件变量

c++ - 这个 "on-fly"传递对象会遭受内存泄漏吗?

c++ - 为什么不建议在空间/辐射环境中使用 C++ 模板?

c# - 暂停程序以允许用户在 wpf 中进行交互