【C/C++】Linux C++ wait_for 的原理

monitor_cv_.wait_for 的工作原理:

  1. 当条件满足时(即 lambda 表达式返回 true),程序会立即向下执行,不会继续等待。
  2. 在等待期间,程序确实会不断检查 lambda 表达式中的条件,即使没有 notify()。

具体来说,wait_for 的工作机制如下:

  1. 首先检查 lambda 表达式(predicate)是否为 true
  2. 如果为 true,则立即返回并继续执行后续代码
  3. 如果为 false,则进入等待状态,但会在两种情况下唤醒:
    • 超过指定的时间间隔(这里是 m_monitor_check_interval_ms)
    • 被其他线程的 notify() 唤醒
  4. 唤醒情况:先检查 predicate,如果是超时,则继续向下执行(无论 predicate 为真为假);
    如果是被notify了,先检查 predicate 条件,如果不满足,则继续wait直到超时; 如果满足,则跳出等待,立马往下执行。

在等待过程中,系统会周期性地检查 predicate 条件,而不是完全阻塞。这使得即使没有显式的 notify() 调用,当条件变为 true 时,程序也能及时响应并继续执行。

这种设计的好处是既保证了及时响应条件变化,又避免了忙等待(busy-waiting),提高了系统效率。

 

// 无论什么情况,都等待一段时间(会被notify提前唤醒)
monitor_cv_.wait_for(lock, m_monitor_check_interval_ms, [this]() {
    // 只有当 predicate 返回 false 时才真正等待
    CIAS_PRINT_DEBUG("[Thread-transmissionMonitorThread]interval=%ld ms", m_monitor_check_interval_ms.count());

    return !transmission_monitoring_.load()||
        !data_buffer_.isEmpty()||
        is_notify_faster_trigger.load();

    // 超时或被 notify 唤醒后,不会再检查 predicate
});

在您提供的代码片段中,lambda 表达式检查三个条件:

  • !transmission_monitoring_.load() - 传输监控是否停止
  • !data_buffer_.isEmpty() - 数据缓冲区是否有数据
  • is_notify_faster_trigger.load() - 是否触发了更快的检查

只要这三个条件中任何一个为 true,程序就会立即继续执行,而不需要等待完整的超时时间。

 

posted @ 2025-12-15 01:25  FBshark  阅读(1)  评论(0)    收藏  举报