在 C++11 中,*_until
仅当使用稳定时钟(即仅以不变的速率向前移动的时钟)时,超时函数才会“按预期”运行。因为system_clock
不是一个稳定的时钟,这意味着像这样的代码的行为可能会非常令人惊讶:
using namespace std::chrono;
std::this_thread::sleep_until(system_clock::now() + seconds(10));
这将导致当前线程休眠 10 秒,除非在休眠期间调整系统时钟,例如夏令时。如果在睡眠期间将时钟调慢一小时,则当前线程将睡眠一小时零 10 秒。
据我所知,每*_until
C++11中的超时函数有对应的*_for
需要持续时间而不是时间点的函数。例如,上面的代码可以重写如下:
using namespace std::chrono;
std::this_thread::sleep_for(seconds(10));
The *_for
函数不必担心在函数执行时调整时钟,因为它们只是说明要等待多长时间,而不是等待结束时应该是什么时间。
此问题影响的不仅仅是 sleep 函数,对于 future 和 try_lock 函数上基于超时的等待也是如此。
我可以想象使用的唯一情况是有意义的*_until
具有不稳定时钟的功能将是当你want考虑到时钟调整,例如,您想睡到下周三凌晨 3:30,即使从现在到那时之间夏令时有变化。是否还有其他情况*_until
函数比函数更有意义*_for
功能?如果不是,可以肯定地说,一般来说,*_for
超时函数应该优先于*_until
功能?
The xxx_until
电话是在你有截止日期时打的。典型的用例是,您对包含多个等待的代码段有严格的时间限制,或者等待之前每个步骤消耗的时间是不可预测的。
e.g.
void foo() {
std::chrono::steady_clock::time_point const timeout=
std::chrono::steady_clock::now()+std::chrono::milliseconds(30);
do_something_which_takes_some_time();
if(some_future.wait_until(timeout)==std::future_status::ready)
do_something_with(some_future.get());
}
这只会处理来自的值some_future
如果从开始起 30ms 内准备好,包括所花费的时间do_something_which_takes_some_time()
.
正如本例所示,大多数用例xxx_until
函数将使用稳定的时钟以获得可预测的超时。
我能想象使用的唯一情况xxx_until
具有非稳定时钟的功能(例如std::chrono::system_clock
) 是用户可见的超时,并且取决于所选时钟的值。闹钟或提醒程序是一个例子,“午夜”运行的备份程序是另一个例子。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)