Spurious wakup被各种平台允许。为了解决这个问题,我们编写以下循环机制:
while(ContinueWaiting())
cv.wait(lock); // cv is a `std::conditional_variable` object
conditional_variable::wait_until()
可以理解相同的内容。但是看下面的例子:
const auto duration = Returns_10_seconds();
while(!Predicate())
cv.wait_for(lock, duration);
想象一下,在1秒时发生了虚假唤醒。尚未达到超时。
还要再等10秒吗?这将导致无限循环,我确信这不会发生。从源代码中,内部
wait_for()
调用wait_until()
。我想了解
wait_for()
如何处理虚假唤醒? 最佳答案
没有。
此功能通常用于以下情况:如果您虚假地醒来,但仍然想要执行其他一些工作。而且,如果您不虚假地唤醒,则想在duration
过去之前强制“虚假”唤醒。这意味着,出于您陈述的确切原因,它通常不像您显示的那样在循环中使用。即超时和虚假唤醒的处理方式相同。
现在您可能想知道,谓词版本做什么,因为它暗示着一个循环?
template <class Rep, class Period, class Predicate>
bool
wait_for(unique_lock<mutex>& lock, const chrono::duration<Rep, Period>& rel_time,
Predicate pred);
指定具有与以下相同的效果:
return wait_until(lock, chrono::steady_clock::now() + rel_time, std::move(pred));
wait_until
的变化确实区分了虚假唤醒和超时。这样做的循环如下:while (!pred())
if (wait_until(lock, abs_time) == cv_status::timeout)
return pred();
return true;