std :: condition_variable :: wait_for和std :: condition_variable :: wait_until有什么区别?

Mat*_*ine 24 c++ multithreading condition-variable c++11

我正在使用参考文献以下列方式解释了这两个:

  • wait_for "阻塞当前线程,直到条件变量被唤醒或在指定的超时持续时间之后"

  • wait_until "阻止当前线程,直到条件变量被唤醒或达到指定的时间点"

有什么不同?是否会wait_until旋转,以便线程可以在发出信号时完全(或多或少)继续,而wait_for只是将线程添加回调度点?

Ada*_*eld 37

区别在于如何表示等待持续时间:wait_for采用相对时间("等待最多10秒"),而wait_until需要一个绝对时间("等到2012年10月30日12:00").

比较时间参数的声明:

// wait_for:
const std::chrono::duration<Rep, Period>& rel_time

// wait_until:
const std::chrono::time_point<Clock, Duration>& abs_time
Run Code Online (Sandbox Code Playgroud)

  • 不,这实际上完美地回答了我的问题. (7认同)

bam*_*s53 26

你的问题和其他答案都重复了差异; 那wait_for等待指定的时间量,并wait_until等待在指定的时间点,但其意义是没有说出来.

A time_point有一个相关的时钟,该时钟用于确定是否有适当的时间.这意味着该wait_until功能会考虑时钟调整.wait_until(..., system_clock::now() + std::chrono::seconds(10))如果时钟恰好在等待结束前一小时调整回来,可能会等待一小时10秒.

持续时间没有任何相关的时钟,因此wait_for选择自己的时钟.该标准规定它使用std :: steady_clock,它无法调整并以相对于实时的稳定速率前进.这意味着wait_for无论对任何时钟进行任何调整,都将等待指定的时间.wait_for(..., std::chrono::seconds(10))保证等待10秒(+实现工作和调度问题的时间).

关于旋转与睡眠线程没有区别; 作为wait_for被指定的行为,如果它被称为wait_untilsteady_clock::now() + duration.


这是标准的一部分,其中详细说明:

[thread.req.timing] 30.2.4/2-4

2实现从超时返回必然会有一些延迟.中断响应,函数返回和调度中的任何开销都会引起"实现质量"延迟,表示为持续时间D i.理想情况下,此延迟将为零.此外,对处理器和存储器资源的任何争用都会引起"管理质量"延迟,表示为持续时间D m.延迟持续时间可能因超时而异,但在所有情况下,更短的更好.

3名称以end结尾的成员函数_for采用指定持续时间的参数.这些函数产生相对超时.实现应该使用稳定的时钟来测量这些功能的时间.给定持续时间参数D t,超时的实时持续时间是D t  +  D i  +  D m.

4名称以end结尾的成员函数_until采用指定时间点的参数.这些函数产生绝对超时.实现应使用时间点中指定的时钟来测量这些功能的时间.给定时钟时间点参数C t,当超时期间未调整时钟时,从超时返回的时钟时间点应为 C t + D i + D m.如果在超时期间将时钟调整到时间C a,则行为应如下所示:
         - 如果C a > C t,等待功能应该尽快唤醒,即C a + D i + D m,因为超时已经满足.[ 注意:当针对稳定时钟测量时,此规范可能导致等待的总持续时间减少.-end note ]

        - 如果C a <= C t,则等待函数不应超时,直到 Clock::now()返回时间C n > = C t,即在C t + D i + D m处唤醒.[ 注意:当向后调整时钟时,此规范可能会导致等待的总持续时间在稳定时钟下测量时增加.当向前调整时钟时,该规范可能导致在对稳定时钟进行测量时等待的总持续时间减少.-end note ]

一个实现应该从上面指定的时间到从C t_until函数调用时间点 之间的差值的稳定时钟相对超时返回的时间从这样的超时返回.[ 注意:当时钟向前调整时,实现应该减少等待的持续时间. - 注意 ]


tom*_*ahh 5

  • wait_for将等待一段时间.例如,它将等待两秒钟.
  • wait_until将等到一段时间后到达.例如,它将等到2013年7月23日晚上11:22:34到达时钟.