C ++ 11标准讨论了如果调整系统时钟使得传递到sleep_until()
的时间点现在已经过去会发生什么应该发生 - 但我无法看到解决此问题的任何地方指定的时间点已经过去了。
我是否只是忽略了某些东西,或者它是否真的没有指定 - 即使是UB或实现定义的?
如果调用sleep_for()
且持续时间为负,则会出现类似的问题。
答案 0 :(得分:4)
计算睡眠和调用sleep_until()
的时间不是原子的。您可能会计算时间,然后发生上下文切换,系统过载,交换以及对sleep_until()
的实际调用发生得更晚。因此,如果sleep_until()
在过去的时间没有醒来,那么它就没用了,因为在这种情况下你永远不能确定你的线程会被唤醒。
该功能的要求在标准的第30.2.4节中规定。并且它指定返回时间应为Ct + Di + Dm,其中Ct是您指定的时间,Di是由开销中断,函数返回和调度引起的延迟,Dm是由资源争用引起的延迟。在这种情况下,Di包括在调用sleep_until()
之前经过的时间,函数会尽快返回。
答案 1 :(得分:2)
你过分分析了这个。
标准是否明确说“如果目标时间过去,那么就没有阻止或等待”?否。
它是否会解释时间步骤如何缩小或消除超时?是。此外,它根据相对超时来定义这些超时。
我认为目的很明确。这是可以但必须从英语措辞中推断出来的情况之一:如果立即满足超时,则不会发生任何事情。
更有意思的是,在任何一种情况下,似乎都没有明确定义是否会有瞬时锁定和解锁周期。
答案 2 :(得分:0)