c++ - 条件变量中触发错误信号的频率如何?

标签 c++ multithreading condition-variable

我不明白为什么 std::condition_variable 比这段代码有更多的标准保证:

class condition_variable {
public:
  void notify_one() {}
  void notify_all() {}
  void wait(unique_lock<mutex> &lock) {
    lock.unlock();
    this_thread::sleep_for(15ms);
    lock.lock();
  }
  void wait(unique_lock<mutex> &lock,
            const function<bool()> &pred) {
    while (!pred()) wait(lock);
  }
};

最佳答案

std::condition_variable::wait() 的最简单实现仅对应于忙等待:

template<typename Predicate>
void wait(std::unique_lock<std::mutex>& lck, Predicate pred) {
   while (!pred()) {
      lck.unlock();
      lck.lock();
   }
}

因此,可能会发生虚假唤醒

您的实现使线程在释放和获取互斥锁之间休眠:

void wait(unique_lock<mutex> &lock) {
   lock.unlock();
   this_thread::sleep_for(15ms); // <--
   lock.lock();
}

不过,找到正确的 sleep 时间可能很困难。它越低,就越类似于忙等待,因此浪费的 CPU 周期就越多。越高,浪费的CPU周期越少,但响应能力越差。

您的实现中发生虚假唤醒的频率取决于 sleep 周期的选择。

关于c++ - 条件变量中触发错误信号的频率如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60276103/

相关文章:

java - 这是删除线程局部对象引用的最佳方法

c++ - 条件变量的谓词

C++ : looking away to implement this scenario

c++ - 具有 C++ 基类的 Python 子类

c++ - UML 类图的表示法

c++ - InvokeHelper 正在调用哪个函数

python - 将 concurrent.futures.ThreadPoolExecuter() 与 kwargs 一起使用

multithreading - 戈朗 : how to bind code with thread?

c++ - 是否正确处理了此代码异常?

c++ - std::atomic 和 std::condition_variable 等待、notify_* 方法的区别