[英]implementation of std::condition_variable::wait_until
我正在阅读std::condition_variable::wait_until
的libstdc ++ 实现 ,这里是源代码:
template<typename _Clock, typename _Duration>
cv_status
wait_until(unique_lock<mutex>& __lock,
const chrono::time_point<_Clock, _Duration>& __atime)
{
// DR 887 - Sync unknown clock to known clock.
const typename _Clock::time_point __c_entry = _Clock::now();
const __clock_t::time_point __s_entry = __clock_t::now();
const auto __delta = __atime - __c_entry;
const auto __s_atime = __s_entry + __delta;
return __wait_until_impl(__lock, __s_atime);
}
template<typename _Clock, typename _Duration, typename _Predicate>
bool
wait_until(unique_lock<mutex>& __lock,
const chrono::time_point<_Clock, _Duration>& __atime,
_Predicate __p)
{
while (!__p())
if (wait_until(__lock, __atime) == cv_status::timeout)
return __p();
return true;
}
第二个函数调用循环中的第一个函数。它将执行时钟同步操作。如果我们调用第二个函数,同步操作可能会运行多次。每次都需要同步时钟吗?我认为代码可以改进在第二个功能中只通过同步时钟一次。对吧?
我觉得你是对的。 另一方面,使用wait_until的假设通常是事件将只是稀疏地发生,并且除了少数不必要的唤醒之外,谓词返回true。 因此,重新同步时钟的开销应该是最小的。 还要记住,在这种情况下,线程必须已经被唤醒并且已经被分页,这可能比查询时钟更昂贵。
是的,不。
是的,这个代码可以优化,以便在循环时不操纵time_point
。 但是,我不确定这是否真的有必要。
考虑是什么使得谓词wait_until
循环。
通知后 ,它会检查谓词以查看是否有工作要做。
wait_until
返回true
。 wait_until
将返回谓词的值,该值通常为false
(否则我们会预期condition_variable
wait_until
变量已被通知)。 这只留下一个循环实际循环的情况:当通知condition_variable
,谓词返回false
。
这被称为虚假唤醒并不是典型的情况,所以它并不值得优化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.