首页 > 解决方案 > 在条件变量中触发错误信号的频率如何?

问题描述

我不明白为什么 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);
  }
};

标签: c++multithreadingcondition-variable

解决方案


最简单的实现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();
}

但是,找到合适的睡眠时间可能很困难。它越低,越像忙等待,因此浪费的 CPU 周期越多。它越高,浪费的 CPU 周期越少,但响应能力越差。

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


推荐阅读