繁体   English   中英

std :: condition_variable wait_for无限

[英]std::condition_variable wait_for infinite

我试图使用以下代码对条件变量进行无限等待(仅显示问题的示例):

std::condition_variable cond;
std::mutex mtx;
std::unique_lock<std::mutex> lock(mtx);
cond.wait_for(lock, std::chrono::steady_clock::duration::max());

但等待会立即退出。 深入研究wait_for的(MS)实现我发现它实际上使用了wait_until函数。 但在此之前,它使用对chrono::system_clock::now()的调用来转换时间,并只添加持续时间。

当然,这会导致整数溢出,因此新时间变为<='now'。 因此wait_until立即退出。 所有其他定时等待函数也是如此(例如std::timed_mutex类中的try_lock_for )。

对上面的内容进行总结,我想问一下这是否是定时等待函数的实现中的一个错误,如果是,那么我可以在哪里写一下呢?

此外,由于wait_until使用system_clock ,如果在等待期间有时间调整(因为system_clock不是单调的),实际等待时间应该会有所不同。 因此,没有信任等待持续时间。

cppreference文档说:

需要注意的是rel_time必须足够小加的时候不要溢出std::chrono::steady_clock::now()

和:

使用与timeout_time相关的时钟,这不需要是单调时钟。如果时钟不连续调整,则无法保证此函数的行为,但现有实现将timeout_time从Clock转换为std::chrono::system_clock并委托给POSIX pthread_cond_timedwait以便等待调用系统时钟,而不是用户提供的时钟。 在任何情况下,由于调度或资源争用延迟,该函数也可能等待超过达到timeout_time之后的时间。

即使使用的时钟是std::chrono::steady_clock或另一个单调时钟,系统时钟调整也可能引起虚假唤醒。

如果你想要无限超时,你可以做这样的事情(未经测试):

wait_until(lock, std::chrono::sys_time::max());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM