gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:05 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com