我遇到的问题是
std::this_thread::sleep_for
实际上使用系统时钟来计算唤醒时间(至少在Windows上),而不是稳定时钟。当系统时钟更改时,这会产生问题。例如。如果我有一个等待间隔很短(例如 50 毫秒)的等待循环,然后我将系统时钟向后设置 2 分钟,则循环将停止 2 分钟而不是 50 毫秒。这是违反直觉的。我预计它是 50 毫秒(+一些小偏差)。在任何其他情况下,如果可以在随机时间唤醒,则此功能没有意义。
关于
sleep_for
函数的文档说可以使用系统时钟,但我认为这是标准中的一个缺陷。至少应该可以选择要使用的时钟类型。或者(更好)标准应该要求时钟稳定。
那么,考虑到这样的缺陷,你知道还有其他与平台无关的方式来睡眠一定的时间吗?
解决此问题的拉取请求已于 2023 年 10 月 21 日合并。
根据更改日志,它登陆了 VS 2022 17.9,根据博客文章,该版本于 2024 年 2 月首次作为非预览版本发布。
基本上,它直接使用
this_thread::sleep_for
Windows API 函数来制作Sleep
。因此,早期 VS 的一个可能的解决方法是直接使用它。
同步设施中的其他地方仍然受到此错误的影响,例如
condition_variable::sleep_for
,修复这些问题的PR已合并,因此希望今年该错误能够完全修复。