c++ - condition_variable::wait_for() 如何处理虚假唤醒?

标签 c++ multithreading c++11 condition-variable spurious-wakeup

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() 是如何处理虚假唤醒的?

最佳答案

I want to understand, how does wait_for() deals with spurious wakeups?

不是。

此功能通常用于以下情况:如果您虚假地醒来,无论如何您都想做一些其他工作。如果您没有虚假唤醒,您希望在 duration 过去之前强制“虚假”唤醒。这意味着它通常不会像您所展示的那样在循环中使用,这正是您陈述的原因。 IE。超时和虚假唤醒的处理相同

现在您可能想知道谓词版本的作用是什么,因为它暗示了一个循环?

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;

关于c++ - condition_variable::wait_for() 如何处理虚假唤醒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31871267/

相关文章:

c++ - 无法消除警告 C4554

c++ - 如何维护对另一个类中元素的线程安全引用

c++ - auto 有什么用? - 日常事件?

c# - 连续执行的多线程 WebRequests

c++ - 锁定焦点并捕获到特定窗口

c++ - 如何在 3D 空间中正确移动相机?

c++ - 从 dll 中获取 DLL 的名称

c++ - boost asio 需要在 m 个工作完成后才发布 n 个工作

c++ - 与 std::vector<>::size() 并发

c++ - Qt4 小部件 : implementing a wait function without blocking the widget