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)
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_until与steady_clock::now() + duration.
这是标准的一部分,其中详细说明:
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函数调用时间点 之间的差值的稳定时钟相对超时返回的时间从这样的超时返回.[ 注意:当时钟向前调整时,实现应该减少等待的持续时间. - 注意 ]
| 归档时间: |
|
| 查看次数: |
6920 次 |
| 最近记录: |