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;

08-16 10:06