当超时时,如果触发或虚假唤醒,`wait_until`的返回值是多少?

问题描述 投票:0回答:1

我对

std::condition_variable::wait_until
的“第一个”版本有疑问,即没有条件谓词参数的版本,它应该返回
std::cv_status
值。

CV 可能会在来自另一个线程的

notify*

 调用或虚假的情况下被唤醒,但随后它会尝试锁定互斥体,然后才退出,并且可能已达到该点的绝对时间。在这两种情况下,如果在退出点时,abs_time 参数值已经是过去的时间,则返回值是多少:

    如果发生虚假唤醒
  • 如果触发唤醒(通过另一个线程的
  • notify*
     调用)
我的意思是:如果返回值是

no_timeout

,这可能是由虚假唤醒引起的,它偶尔会在超时边缘唤醒线程,使函数在时间参数已经存在的情况下退出过去?或者,换句话说,即使返回值是
no_timeout
,我是否应该在函数退出后自己重新检查时间参数?注意:我相信代码对我来说有趣的条件总是通过 
notify_all()
 调用进行更新(实际上有很多不同的条件,等待函数无法真正检查所有条件)。

或更简单地说:虚假唤醒是“假超时”还是“假触发”?

c++11 condition-variable
1个回答
0
投票
似乎标准

没有明确指定这种情况,尽管在我看来,这确实指的是在wait_until

返回的时间点测量的超时。

我查看了 libstdc++ 和 libc++ 的实现,似乎都在互斥锁再次锁定之后在返回之前检查了时间参数:

libc++

__do_timed_wait(__lk, __t_ns); return _Clock::now() < __t ? cv_status::no_timeout : cv_status::timeout;

libstdc++

_M_cond.wait_until(*__lock.mutex(), CLOCK_MONOTONIC, __ts); return (steady_clock::now() < __atime ? cv_status::no_timeout : cv_status::timeout);
    
© www.soinside.com 2019 - 2024. All rights reserved.