我可以使用now()将wait_until转换为wait_for吗?

时间:2017-02-14 11:36:54

标签: c++ c++11 chrono

我正在实现我自己建立在第三方等待函数Future之上的thirdPartyWait(int milliseconds)类。我希望Futurestd::future的界面兼容,这意味着我想同时提供wait_forwait_until

wait_for很简单,因为它直接映射到thirdPartyWait(我可以处理其中的毫秒转换)。但是,wait_until并没有很好地映射。直观地说,我认为以下应该做我想做的事情:

template <class Clock, class Duration>
std::future_status wait_until(const std::chrono::time_point<Clock, Duration> &timeout) const
{
  return wait_for(timeout - Clock::now());
}

我已经对代码进行了测试并且可以正常运行,但我很清楚,简单的测试并未涵盖所有极端情况。我对chrono的{​​{1}}部分不够熟悉,因此我的问题是:

我在std的实施中是否存在任何隐藏的陷阱,或者我可以期望它按预期工作?

1 个答案:

答案 0 :(得分:2)

cppreference有关于std::future::wait_until

的说法
  

使用与timeout_time相关的时钟,这不需要是单调时钟。如果时钟不连续调整,则无法保证此函数的行为,但现有实现将timeout_time从Clock转换为std :: chrono :: system_clock并委托给POSIX pthread_cond_timedwait,以便等待调用系统时钟,而不是用户提供的时钟。在任何情况下,由于调度或资源争用延迟,函数也可能等待超过达到timeout_time之后的时间。

我从中推断出当前的实现正如您正在做的那样。

http://en.cppreference.com/w/cpp/thread/future/wait_until