繁体   English   中英

std :: condition_variable :: wait_until的实现

[英]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循环。

通知后 ,它会检查谓词以查看是否有工作要做。

  1. 如果谓词返回true,即条件变量保护的条件为真,则wait_until返回true
  2. 如果超时过去, wait_until将返回谓词的值,该值通常为false (否则我们会预期condition_variable wait_until变量已被通知)。

这只留下一个循环实际循环的情况:当通知condition_variable ,谓词返回false

这被称为虚假唤醒并不是典型的情况,所以它并不值得优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM