c++ - 在条件变量中触发错误信号的频率如何?
问题描述
我不明白为什么 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();
}
但是,找到合适的睡眠时间可能很困难。它越低,越像忙等待,因此浪费的 CPU 周期越多。它越高,浪费的 CPU 周期越少,但响应能力越差。
您的实现中发生虚假唤醒的频率取决于睡眠期的选择。
推荐阅读
- c# - 如何将用户帐户添加到组(成员)
- itk - itkMRIBiasFieldCorrectionFilter 不会运行
- android - 如何在 OnCreateActionMode() 中更改操作栏菜单的颜色
- python - DAG 是否可以检测到 Airflow 中特定日期的首次运行?
- node.js - 验证邮箱后登录无反应
- python - get_matching_blocks() 忽略一些块,如果它首先与后面的块匹配
- javascript - 保持循环,直到我从 API 获得共鸣
- javascript - 套接字未在 angular-firebase 上连接以获取实时更新
- angular - 电子自动更新错误错误:net::ERR_TIMED_OUT
- jax-rs - 如何理解 JAX-RS?