多线程wait_for和wait_until区别

276 阅读1分钟

在多线程编程中,wait_forwait_until 是用于等待某些条件发生的两种常见方法。

  1. wait_for: wait_for 方法允许您指定一个时间段,在这个时间段内等待某个条件成立。如果条件在指定的时间段内变为真,则该方法返回;如果超过了指定的时间段,而条件仍未成立,则该方法也返回。在C++中,std::condition_variablestd::future 等类提供了 wait_for 方法。

    std::condition_variable cv;
    std::mutex mtx;
    bool condition = false;
    
    // 等待条件在一定时间内成立
    std::unique_lock<std::mutex> lck(mtx);
    auto timeout = std::chrono::milliseconds(1000); // 1秒
    if (cv.wait_for(lck, timeout, [](){ return condition; })) {
        // 条件在超时前变为真
    } else {
        // 超时
    }
    
  2. wait_until: wait_until 方法允许您指定一个绝对时间点,在这个时间点前等待某个条件成立。如果条件在指定的时间点前变为真,则该方法返回;如果到达了指定的时间点,而条件仍未成立,则该方法也返回。在C++中,std::condition_variablestd::future 等类同样提供了 wait_until 方法。

    std::condition_variable cv;
    std::mutex mtx;
    bool condition = false;
    
    // 等待条件在指定时间点前成立
    std::unique_lock<std::mutex> lck(mtx);
    auto timeout = std::chrono::steady_clock::now() + std::chrono::milliseconds(1000); // 1秒后
    if (cv.wait_until(lck, timeout, [](){ return condition; })) {
        // 条件在指定时间点前变为真
    } else {
        // 超时
    }
    

这两种方法都允许您在等待过程中指定超时时间,但是 wait_until 允许您指定一个绝对时间点,而 wait_for 允许您指定一个相对时间段。选择哪种方法取决于您的需求以及您更方便使用的时间表示方式。