std :: condition_variable wait_for infinite

时间:2017-02-07 02:34:50

标签: c++ c++11 synchronization wait condition-variable

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

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()调用来转换时间,只需添加持续时间。

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

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

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

1 个答案:

答案 0 :(得分:0)

cppreference documentation说:

  

请注意,rel_time必须足够小,以免添加到std::chrono::steady_clock::now()时溢出。

并且:

  

使用与timeout_time绑定的时钟,它不一定是单调时钟。如果不连续调整时钟,则无法保证此功能的行为,但是现有的实现将timeout_time从Clock转换为{{1 }}并委派给POSIX std::chrono::system_clock,以便等待遵守对系统时钟的调整,而不是对用户提供的Clock的调整。在任何情况下,由于调度或资源争用延迟,该功能还可能比到达pthread_cond_timedwait之前的等待时间更长。

     

即使使用的时钟是timeout_time或其他单调时钟,系统时钟调整也可能会导致虚假唤醒。

如果您希望无限超时,则可以执行以下操作(未测试):

std::chrono::steady_clock