gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:42:42 26 4
gpt4 key购买 nike

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

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

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

据我所知,C++11 中的每个 *_until 超时函数都有一个相应的 *_for 函数,该函数采用持续时间而不是时间点。比如上面的代码可以改写如下:

using namespace std::chrono;
std::this_thread::sleep_for(seconds(10));

*_for 函数不必担心在函数执行时会调整时钟,因为它们只是说明等待多长时间,而不是等待时应该是什么时间结束了。

此问题影响的不仅仅是 sleep 函数,对于基于超时的 future 等待和 try_lock 函数也是如此。

我可以设想将 *_until 函数与不稳定时钟一起使用的唯一情况是,当您想要考虑时钟调整时,例如,您想睡到下周三凌晨 3:30,即使从现在到那时夏令时之间有变化。在其他情况下,*_until 函数比 *_for 函数更有意义吗?如果不是,是否可以肯定地说,通常 *_for 超时函数应该优于 *_until 函数?

最佳答案

xxx_until 调用适用于您有截止日期时。典型的用例是您对包含多个等待的一段代码有严格的时间限制,或者等待之前每个步骤所消耗的时间是不可预测的。

例如

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 的值,前提是它在开始后 30 毫秒内准备好,包括 do_something_which_takes_some_time() 所用的时间。

在本例中,xxx_until 函数的大多数用例都将使用稳定的时钟,以实现可预测的超时。

我能想象到的唯一情况是使用带有非稳定时钟的 xxx_until 函数(例如 std::chrono::system_clock) 是用户可见的超时,取决于所选时钟的值。闹钟或提醒程序是一个例子,“午夜”运行的备份程序是另一个例子。

关于c++ - 什么时候适合使用 C++11 *_until 超时函数而不是相应的 *_for 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11200763/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com