condition_variable :: wait_for()如何处理虚假的唤醒?

iam*_*ind 6 c++ multithreading condition-variable c++11 spurious-wakeup

各种平台都允许虚假wakup.为了解决这个问题,我们在下面写出循环机制:

while(ContinueWaiting())
  cv.wait(lock);   // cv is a `std::conditional_variable` object
Run Code Online (Sandbox Code Playgroud)

同样的事情是可以理解的conditional_variable::wait_until().
但请看下面的例子:

const auto duration = Returns_10_seconds();
while(!Predicate())
  cv.wait_for(lock, duration);
Run Code Online (Sandbox Code Playgroud)

想象一下,虚假的唤醒发生在1秒钟.超时尚未达成.
它会再等10秒吗?这将导致无限循环,我相信不应该发生.从源代码,内部wait_for()调用wait_until().

我想了解,如何wait_for()处理虚假的唤醒?

How*_*ant 5

我想了解,如何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);
Run Code Online (Sandbox Code Playgroud)

指定具有与以下相同的效果:

return wait_until(lock, chrono::steady_clock::now() + rel_time, std::move(pred));
Run Code Online (Sandbox Code Playgroud)

wait_until变化确实区分了虚假唤醒和超时。这样做的循环如下:

while (!pred())
    if (wait_until(lock, abs_time) == cv_status::timeout)
        return pred();
return true;
Run Code Online (Sandbox Code Playgroud)