本文主要是介绍C++之std::condition_variable::wait_for,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
std::condition_variable::wait_for
是 C++11 引入的条件变量的一部分,用于在一定时间内等待通知。它是 std::condition_variable
类的成员函数之一,可以使线程在等待某条件变为真时,最多等待指定的时间段。
使用方法
在 std::condition_variable
中,wait_for
的主要形式如下:
cpp
template< class Rep, class Period >
std::cv_status wait_for( std::unique_lock<std::mutex>& lock,const std::chrono::duration<Rep,Period>& rel_time );template< class Rep, class Period, class Predicate >
bool wait_for( std::unique_lock<std::mutex>& lock,const std::chrono::duration<Rep,Period>& rel_time,Predicate pred );
- 第一种形式无谓词,等待特定的时间段或直到被其他线程通知。
- 第二种形式带有谓词,等待特定的时间段或直到谓词返回
true
。
参数说明
lock
:一个std::unique_lock<std::mutex>
对象,负责在等待期间持有互斥锁。rel_time
:等待的相对时间,是std::chrono::duration
类型。pred
:谓词(lambda 或可调用对象),用于判断条件是否满足。
返回值
- 如果无谓词版本的
wait_for
在指定时间段内被唤醒,则返回std::cv_status::no_timeout
;如果超时则返回std::cv_status::timeout
。 - 如果带有谓词的
wait_for
在指定时间段内被唤醒并且谓词返回true
,则返回true
;否则返回false
。
示例代码
以下是一个简单的示例,展示了如何使用 std::condition_variable::wait_for
来实现限时等待:
cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>std::mutex mtx;
std::condition_variable cv;
bool ready = false;void worker() {std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟工作{std::lock_guard<std::mutex> lock(mtx);ready = true;}cv.notify_one(); // 通知等待的线程
}int main() {std::thread t(worker);std::unique_lock<std::mutex> lock(mtx);if (cv.wait_for(lock, std::chrono::seconds(2), []{ return ready; })) {std::cout << "Worker线程已完成工作。" << std::endl;} else {std::cout << "等待超时。" << std::endl;}t.join();return 0;
}
在这个示例中:
worker
线程模拟了一些工作,睡眠 1 秒后设置ready
为true
并通知主线程。- 主线程启动
worker
线程并等待条件变量至多 2 秒,检查ready
是否变为true
。 - 如果在 2 秒内
ready
变为true
,则输出 "Worker线程已完成工作。",否则输出 "等待超时。" -
在调用
wait_for
函数时,会在内部解锁lock
,并在等待期间重新获取锁。这样做是为了避免死锁,并且符合条件变量的使用惯例。具体地说,
wait_for
函数会在等待之前释放lock
,使得其他线程可以在需要时获取该锁。当条件变量满足等待条件或超时后,wait_for
函数会重新获取lock
,并继续执行。因此,在使用
wait_for
函数时,无需手动在等待之前释放锁或在等待结束后重新获取锁,这些操作都由wait_for
函数在内部处理。
通过这个示例,可以看到 std::condition_variable::wait_for
如何用于实现限时等待和条件判断,从而使得多线程编程更加灵活和高效。
这篇关于C++之std::condition_variable::wait_for的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!