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/