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

Jer*_*emy 8 c++ language-lawyer c++11 c++-chrono stdthread

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

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

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

Ale*_*nov 5

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

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


Lig*_*ica 2

你对这个问题分析过度了。

标准是否明确规定“如果目标时间在过去,则不会出现阻塞或等待”?不。

它是否特意解释了时间步将如何缩小或消除超时?是的。此外,它还根据相对超时来定义这些超时。

我想,其意图是相当明确的。这是您可以必须从英语措辞中推断出的情况之一:如果立即满足超时,则不会发生任何事情。

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