【发布时间】:2018-08-08 20:36:35
【问题描述】:
我有一个我认为很简单的模式 - 我想在未来 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));
}
使用 g++ (GCC) 4.8.5,这永远不会返回。我也尝试过 system_clock 的结果相同。使用 strace 检查发生了什么,我得到的最后一件事是:
nanosleep({4294967295, 0},
所以我猜它最终会回来,但我不想等那么久。
这是一个 g++ 错误吗?我无法想象这种行为是故意的。我发现了Is behaviour well-defined when sleep_until() specifies a time point in the past? 的问题,但似乎并没有就标准是否实际指定应该发生的事情得出任何结论。我已经为我的问题实施了另一种解决方案;我只是好奇我看到的是 UB 还是 bug。
【问题讨论】:
-
这看起来像一个错误。在 4.9 或更高版本上它不会挂起。
-
我的回答错了,所以我把它删了。标准中的措辞并没有真正指定,据我所知,当 time_point 过去时会发生什么。不过,它看起来仍然像一个错误。
-
它确实指定了,但是,如果时钟调整到所述时间点之后,它应该尽快唤醒。这就是我在回答中(错误地)引用的内容。
-
@CássioRenan:我是在您删除答案之前对您的答案进行投票的人,我也是在
<chrono>和_until函数上领导标准化过程的人。如果规范没有说这是一个错误,那么规范中也有一个错误。如果您对如何改进规范有任何建议,请here is how to go about that。 -
@HowardHinnant 我知道 Stackoverflow 并不是真正的“谢谢”之类的地方,但我必须说我们在这里的小交流激发了我更多的学习,我终于可以阅读这部分标准并充分理解它,可以说我知道我在说什么,我以前不习惯这样做。所以,非常感谢! (顺便说一句,该错误已在 gcc 上修复:我已经更新了答案)。
标签: c++ multithreading chrono