Kev*_*vin 3 c++ multithreading c++-chrono
我有一个我认为是简单的模式 - 我想在未来 5 秒创建一个时间点,运行一个可能需要一段时间的任务,然后睡眠直到该时间点(如果已经达到该时间,则可能根本不睡眠.)但是,每当尝试使用std::this_thread::sleep_until过去的时间点时,我的应用程序就会永远挂起。这是一个 MCVE:
#include <chrono>
#include <thread>
int main(){
std::this_thread::sleep_until(std::chrono::steady_clock::now() - std::chrono::seconds(1));
}
Run Code Online (Sandbox Code Playgroud)
使用 g++ (GCC) 4.8.5,这永远不会返回。我也尝试过 system_clock ,结果相同。使用 strace 检查发生了什么,我得到的最后一件事是:
nanosleep({4294967295, 0},
Run Code Online (Sandbox Code Playgroud)
所以我想它最终会回来,但我不想等那么久。
这是一个 g++ 错误吗?我无法想象这种行为是故意的。我发现问题是指定过去的时间点时行为是否明确定义?sleep_until()但对于该标准是否确实指定了应该发生的事情,似乎并没有真正得出任何结论。此后我对我的问题实施了另一种解决方案;我只是好奇我所看到的是 UB 还是 bug。
看起来像一个错误:
\n\n\n\n\n30.2.4 计时规范[thread.req.timing]
\n\n4 \n 名称以 结尾的函数
\n_\xc2\xaduntil采用指定时间点的参数。\n 这些函数产生绝对超时。\n 实现应使用时间点中指定的时钟来测量这些函数的时间。\n 给定一个 时钟时间点参数C t ,当超时期间不调整时钟时,超时返回的时钟时间点应为C t +D i +D m 。\n(...)
其中 Di定义为“实施质量”延迟,D m被定义为“管理质量”延迟。
\n\n正如 Howard Hinnant 精彩地强调的那样,实现应努力最小化 D i和 D m:
\n\n\n\n\n30.2.4 计时规范[thread.req.timing]
\n\n2 \n 实现在从超时返回时必然有一些延迟。\n 中断响应、函数返回和调度中的任何开销都会导致\xe2\x80\x9c 实现质量\xe2\x80\x9d 延迟,表示为持续时间 D i .\n 理想情况下,此延迟为零。\n 此外,对处理器和内存资源的任何争用都会导致\xe2\x80\x9c 管理质量\xe2\x80\x9d 延迟,表示为持续时间 D m。\n 延迟持续时间可能因超时而异,但在所有情况下越短越好。
\n
请注意,无论 C t的值是多少,这都必须成立,并且无限延迟绝对不是最小的。
\n\n作为一个小更新,这个问题现已修复,从版本 4.9.3 开始。这是错误跟踪器上的信息。
\n