Kno*_*abe 22 c++ timeout c++11
在C++ 11中,*_until仅当使用稳定时钟(即,仅以不变速率向前移动的时钟)时,超时功能才"按预期"运行.因为system_clock不是一个稳定的时钟,这意味着像这样的代码可以表现得非常惊人:
using namespace std::chrono;
std::this_thread::sleep_until(system_clock::now() + seconds(10));
Run Code Online (Sandbox Code Playgroud)
除非在睡眠期间调整系统时钟,例如夏令时,否则这将导致当前线程休眠10秒.如果在休眠期间将时钟设置为一小时,则当前线程将休眠一小时10秒.
据我所知,*_untilC++ 11中的每个超时函数都有一个相应的*_for函数,它需要一个持续时间而不是一个时间点.例如,上面的代码可以重写如下:
using namespace std::chrono;
std::this_thread::sleep_for(seconds(10));
Run Code Online (Sandbox Code Playgroud)
这些*_for函数不应该担心在函数执行时调整的时钟,因为它们只是说等待多长时间,而不是等待时间应该是什么时间.
此问题不仅影响睡眠功能,对于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());
}
Run Code Online (Sandbox Code Playgroud)
这将仅处理some_future从开始起30ms内准备好的值,包括所需的时间do_something_which_takes_some_time().
如在此示例中,xxx_until函数的大多数用例将使用稳定时钟以具有可预测的超时.
我可以想象使用具有非稳定时钟(例如)的xxx_until函数的唯一情况std::chrono::system_clock是超时是用户可见的,并且取决于所选时钟的值.闹钟或提醒程序就是一个例子,"午夜"运行的备份程序是另一个例子.