其他分享
首页 > 其他分享> > c – 如何在等待std :: condition_variable时处理系统时钟更改?

c – 如何在等待std :: condition_variable时处理系统时钟更改?

作者:互联网

我正在尝试在C 11中实现一些跨平台代码.此代码的一部分使用std::condition_variable实现信号量对象.当我需要在信号量上进行定时等待时,我使用wait_until或wait_for.

我遇到的问题是,基于POSIX的系统上的condition_variable的标准实现似乎依赖于on the system clock, rather than the monotonic clock(另请参见:this issue against the POSIX spec)

这意味着如果系统时钟在过去的某个时间发生变化,我的条件变量将阻塞的时间比我预期的要长得多.例如,如果我希望我的condition_variable在1秒后超时,如果有人在等待期间将时钟调整回10分钟,则condition_variable会阻塞10分钟1秒.我已经确认这是Ubuntu 14.04 LTS系统上的行为.

我需要依赖这个超时至少有些准确(即,在某些误差范围内它可能是不准确的,但如果系统时钟发生变化仍然需要执行).看起来我需要做的就是编写我自己的condition_variable版本,该版本使用POSIX函数并使用单调时钟实现相同的接口.

这听起来像很多工作 – 而且有点混乱.还有其他解决此问题的方法吗?

解决方法:

在考虑了这个问题的可能解决方案之后,似乎最有意义的解决方案是禁止使用std :: condition_variable(或者至少要明确指出它总是会使用系统时钟).然后我必须以一种尊重时钟选择的方式自己重新实现标准库的condition_variable.

由于我必须支持多个平台(Bionic,POSIX,Windows,最终是MacOS),这意味着我将维护此代码的多个版本.

虽然这很讨厌,但似乎替代方案甚至更糟糕.

标签:c,c11,time,condition-variable,system-clock
来源: https://codeday.me/bug/20190910/1801173.html