C++11 中提供的条件变量, 需要配合 mutex 和 unique_lock 使用
头文件
#include <condition_variable>
使用方法
等待函数
首先声明一个 unique_lock<mutex> lock(mtx);
condition_variable 有以下几个 wait 函数
wait() : 用于阻塞线程并等待唤醒。有两个重载
- 其中一个只需要传递一个 unique_lock
- 另一个 需要传递一个unique_lock 和一个 lambda 表达式, 这个lambda 用来判断某些条件,在收到其它线程的通知后仅仅有当 它返回值为 true 时才会被解除堵塞
wait_for() : 在指定的超时时间内它,阻塞线程并等待唤醒, 两个重载
- 传递 unique_lock 和 一个 chrono::duration 类型的对象,代表一段时间, 功能与wait() 的第一个重载一样, 只多了一个超时时间
- 传递 unique_lock 、chrono::duration 和 一个判断条件 的 lambda 表达式, 功能类似wait() 第二个重载
返回值
如果条件变量在指定的超时时间内变为满足,线程将被唤醒,并且 wait_for() 返回 cv_status::no_timeout。
如果超时时间到期且仍未收到唤醒通知,wait_for() 返回 cv_status::timeout,线程继续执行。
如果超时时间到期且仍未收到唤醒通知,wait_for() 返回 cv_status::timeout,线程继续执行。
- wait_until() : 基本同wait_for() 只不过 一段时间变成了一个 time_point 时间点
示例 , 这个示例只是演示这几个函数的用法, 具体使用要根据实际需求来确定
condition_variable cond;
mutex mtx;
unique_lock<mutex> lock(mtx);
cond.wait(lock); // 等待唤醒
cond.wait(lock, []{return true;}); // 等待唤醒, 只有当 lambda 返回 true 时才会被唤醒
cond.wait_for(lock, chrono::seconds(1)); // 等待唤醒,最多等待1秒
cond.wait_until(lock, chrono::steady_clock::now() + chrono::seconds(1)); // 等待唤醒,最多等待1秒
通知函数
- notify_one() : 没有参数, 用于唤醒等待在条件变量上的单个线程。
- notify_all() : 没有参数, 用于唤醒等待在条件变量上的所有线程。