我对
std::condition_variable::wait_until
的“第一个”版本有疑问,即没有条件谓词参数的版本,它应该返回 std::cv_status
值。
CV 可能会在来自另一个线程的 notify*
调用或虚假的情况下被唤醒,但随后它会尝试锁定互斥体,然后才退出,并且可能已达到该点的绝对时间。在这两种情况下,如果在退出点时,abs_time 参数值已经是过去的时间,则返回值是多少:
notify*
调用)
no_timeout
,这可能是由虚假唤醒引起的,它偶尔会在超时边缘唤醒线程,使函数在时间参数已经存在的情况下退出过去?或者,换句话说,即使返回值是
no_timeout
,我是否应该在函数退出后自己重新检查时间参数?注意:我相信代码对我来说有趣的条件总是通过
notify_all()
调用进行更新(实际上有很多不同的条件,等待函数无法真正检查所有条件)。或更简单地说:虚假唤醒是“假超时”还是“假触发”?
没有明确指定这种情况,尽管在我看来,这确实指的是在wait_until
返回的时间点测量的超时。我查看了 libstdc++ 和 libc++ 的实现,似乎都在互斥锁再次锁定之后在返回之前检查了时间参数:
__do_timed_wait(__lk, __t_ns);
return _Clock::now() < __t ? cv_status::no_timeout : cv_status::timeout;
_M_cond.wait_until(*__lock.mutex(), CLOCK_MONOTONIC, __ts);
return (steady_clock::now() < __atime
? cv_status::no_timeout : cv_status::timeout);