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()
处理虚假的唤醒?
我想了解,如何
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)