当`sleep_until()`指定过去的时间点时,行为是否定义良好?

时间:2016-10-04 09:02:13

标签: c++ c++11 language-lawyer chrono stdthread

C ++ 11标准讨论了如果调整系统时钟使得传递到sleep_until()的时间点现在已经过去会发生什么应该发生 - 但我无法看到解决此问题的任何地方指定的时间点已经过去了。

我是否只是忽略了某些东西,或者它是否真的没有指定 - 即使是UB或实现定义的?

如果调用sleep_for()且持续时间为负,则会出现类似的问题。

3 个答案:

答案 0 :(得分:4)

计算睡眠和调用sleep_until()的时间不是原子的。您可能会计算时间,然后发生上下文切换,系统过载,交换以及对sleep_until()的实际调用发生得更晚。因此,如果sleep_until()在过去的时间没有醒来,那么它就没用了,因为在这种情况下你永远不能确定你的线程会被唤醒。

该功能的要求在标准的第30.2.4节中规定。并且它指定返回时间应为Ct + Di + Dm,其中Ct是您指定的时间,Di是由开销中断,函数返回和调度引起的延迟,Dm是由资源争用引起的延迟。在这种情况下,Di包括在调用sleep_until()之前经过的时间,函数会尽快返回。

答案 1 :(得分:2)

你过分分析了这个。

标准是否明确说“如果目标时间过去,那么就没有阻止或等待”?否。

它是否会解释时间步骤如何缩小或消除超时?是。此外,它根据相对超时来定义这些超时。

我认为目的很明确。这是可以必须从英语措辞中推断出来的情况之一:如果立即满足超时,则不会发生任何事情。

更有意思的是,在任何一种情况下,似乎都没有明确定义是否会有瞬时锁定和解锁周期。

答案 2 :(得分:0)

From here

  

阻止当前线程的执行,直到指定sleep_time   已经到达。

即如果时间过去,则不会长时间阻止。