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

Can I convert wait_until to wait_for using now()?

本文关键字:wait 转换 for until 可以使 now 我可以      更新时间:2023-10-16

我正在实现我自己的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());
}

我已经测试了代码并且它有效,但我知道简单的测试并不能涵盖所有极端情况。我对stdchrono部分不够熟悉,因此我的问题:

在实现wait_until时是否有任何隐藏的陷阱,或者我可以期望它按预期工作吗?

cppPreferences对std::future::wait_until有这样的说法:

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

从中我推断当前的实现与您正在做的完全一样。

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