在 C++11 中,*_until
只有在使用稳定时钟(即仅以不变的速率向前移动的时钟)时,超时函数才会“按预期”运行。因为system_clock
不是一个稳定的时钟,这意味着这样的代码可能会表现得非常令人惊讶:
using namespace std::chrono;
std::this_thread::sleep_until(system_clock::now() + seconds(10));
这将导致当前线程休眠 10 秒,除非在休眠期间调整系统时钟,例如夏令时。如果在睡眠期间将时钟调回一小时,则当前线程将睡眠一小时十秒。
据我所知,*_until
C++11 中的每个超时函数都有一个相应的*_for
函数,它需要一个持续时间而不是一个时间点。例如,上面的代码可以改写如下:
using namespace std::chrono;
std::this_thread::sleep_for(seconds(10));
这些*_for
函数不必担心在函数执行时会调整时钟,因为它们只是说明等待多长时间,而不是等待结束时应该是什么时间。
这个问题影响的不仅仅是 sleep 函数,对于基于超时的 future 等待和 try_lock 函数也是如此。
*_until
我可以设想使用具有不稳定时钟的函数的唯一情况是当您想要考虑时钟调整时,例如,您想睡到下周三凌晨 3:30,即使有变化从现在到那时的夏令时。在其他情况下,*_until
函数比函数更有意义*_for
吗?如果不是,是否可以肯定地说,一般来说,*_for
超时函数应该优先于*_until
函数?