【发布时间】:2020-12-17 06:43:39
【问题描述】:
我有一个计时器类,它使用std::condition_variable wait_until(我也尝试过wait_for)。我正在使用std::chrono::steady_clock time 等到未来的特定时间。
这意味着是单调的,但一直存在一个长期存在的问题,即它实际上使用系统时钟并且在系统时间更改时无法正常工作。
已按照此处的建议在 libc 中修复:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=41861。
问题是这仍然很新 ~2019 并且仅在 gcc 版本 10 中可用。我有一些仅高达 gcc 版本 ~8 的交叉编译器。
如果有办法将此修复程序添加到我的 gcc 版本(我有很多交叉编译器)中,我正在徘徊? - 但是如果我每次更新交叉编译器时都必须重新构建它们,这可能很难维护。
所以一个更好的问题可能是,在我将所有工具升级到 gcc v10 之前,有什么解决方案可以解决这个问题? - 如何使我的计时器能够抵抗系统时间变化?
更新笔记
- Rustyx 提到所需的 glibc 版本是 2.3.0+(更多供我参考 - 使用
ldd --version进行检查) - glibc 更改日志显示了 Daniel Langr 提供的修复的相关条目:https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/ChangeLog-2019#L2093
- 所需的 glibc 补丁(由 rustyx 提供):https://gcc.gnu.org/git/?p=gcc.git&a=commit;h=ad4d1d21ad5c515ba90355d13b14cbb74262edd2
【问题讨论】:
-
我相信这是 libstdc++ 的问题,而不是编译器本身。您不能独立于 GCC 升级您的“系统”libstdc++ 版本吗?这是link to changelog。
-
您需要 glibc 2.3.0+ (pthread_cond_clockwait) 并使用提供的 patch 修补您的 libstdc++
-
@DanielLangr 我在这里可能是错的,但 libc++ 不是构建工具包的一部分 - 我认为它是 gcc 附带的吗? - 在链接中它说它在 gcc v10 中是固定的(页面的最后一行)。将 libc++ 更改为其他版本可能会破坏很多东西吗? - 我没有真正尝试过这个,除了一个非常小的变化(比如从 libc++ v6.0.1 到 v6.0.2 - 不是实数!)
-
@code_fodder 我认为您始终可以构建自己的 libstdc++ 版本并告诉 GCC 使用它而不是 GCC 附带的系统默认版本/版本。
-
@DanielLangr 所以我只是看看我的目标设置,我们正在使用 bitbake 创建 rootfs(其中包含 glibc 等),所以我认为我只是需要修补我的 bitbake 包中的 glibc 版本,因为它包含所有源代码,我只需要它在目标上工作。在我的本机 linux 发行版上重建 gllibc 可能更难,因为我没有设置这样做:o - 感谢两者,我认为这给了我正确的探索方向。请随时更新为答案
标签: c++ linux gcc condition-variable