我不明白为什么 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/