什么时候适合使用 C++11 *_until 超时函数而不是相应的 *_for 函数?

2024-02-18

在 C++11 中,*_until仅当使用稳定时钟(即仅以不变的速率向前移动的时钟)时,超时函数才会“按预期”运行。因为system_clock不是一个稳定的时钟,这意味着像这样的代码的行为可能会非常令人惊讶:

using namespace std::chrono;
std::this_thread::sleep_until(system_clock::now() + seconds(10));

这将导致当前线程休眠 10 秒,除非在休眠期间调整系统时钟,例如夏令时。如果在睡眠期间将时钟调慢一小时,则当前线程将睡眠一小时零 10 秒。

据我所知,每*_untilC++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(使用前将#替换为@)

什么时候适合使用 C++11 *_until 超时函数而不是相应的 *_for 函数? 的相关文章

随机推荐