c++ - std::condition_variable::wait_until 的实现

标签 c++ multithreading condition-variable

我正在阅读 libstdc++ implementation std::condition_variable::wait_until,这里是来源:

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。因此,重新同步时钟的开销应该是最小的。还要记住,在这种情况下,线程必须被唤醒并已经被调入,这可能比查询时钟更昂贵。

关于c++ - std::condition_variable::wait_until 的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32327829/

相关文章:

c++ - std::condition_variable 中可能的竞争条件?

c++ - 为什么std::unique_lock在不使用的时候在这里声明

c++ - std::condition_variable::wait_until 函数

c++ - 使用 gSOAP 以本地时间而不是 UTC 返回日期时间

c++ - 基于位置的包中的特定类型

python - 限制 Popen() 调用

Linux RT Preempt - 是否需要 POSIX 线程?

c++ - sizeof 和类型,保证

c++ - 通过接受原始数组引用的 constexpr 构造函数初始化 constexpr 变量时的 MSVC 错误?

java - Android AsyncTask 无法运行