我有一个使用 std::condition_variable
的计时器类wait_until
(我也试过 wait_for
)。我正在使用 std::chrono::steady_clock time
等到 future 的特定时间。
这意味着是单调的,但这是一个长期存在的问题,它实际上使用系统时钟并且在系统时间更改时无法正常工作。
它已按照此处的建议在 libc 中修复:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=41861 .
问题是这仍然很新~2019 并且仅在 gcc 版本 10 中可用。我有一些仅高达 gcc 版本 ~8 的交叉编译器。
如果有办法将此修复程序添加到我的 gcc 版本(我有很多交叉编译器)中,我会徘徊吗? - 但是如果我每次更新交叉编译器时都必须重新构建它们,这可能很难维护。
所以一个更好的问题可能是,在我将所有工具都升级到 gcc v10 之前,这个问题的解决方案是什么? - 我怎样才能让我的计时器抵抗系统时间的变化?
更新笔记
ldd --version
来检查)最佳答案
就是这样。这样就解决了问题。
如有必要,您还可以为表中的每个条目添加一个 bool 值,并在添加条目时将其设置为 false。如果时钟观察线程已经广播了条件变量,让它将 bool 设置为 true,这样被唤醒的线程就会知道它们被唤醒的原因。
如果您愿意,您可以在创建条件变量时将其添加到列表中,并在销毁时将其从列表中删除。如果时钟跳跃,这将导致广播条件变量没有线程被阻塞,但这是无害的。
以下是一些实现建议:
使用专用线程查看时钟。一个容易看的事情是墙上时间和系统正常运行时间之间的偏移量。
要做的一件简单的事情是记录观察到的时间跳跃次数,并在每次感觉到时间跳跃时增加它。等待条件时,可以使用以下逻辑:
你可以把这一切都包装起来,这样调用代码就没有丑陋了。它只是从您的 wait_for 版本中成为另一个可能的返回值.
关于c++ - 系统时间更改时 wait_until 的 condition_variable 解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63631963/