- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在 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/
在 C++11 中,*_until 超时函数只有在使用稳定时钟(即仅以不变的速率向前移动的时钟)时才会“按预期”运行。因为 system_clock 不是一个稳定的时钟,这意味着像这样的代码可以表现得
我是一名优秀的程序员,十分优秀!