std::condition_variable

默认分类 · 2024-06-21 · 126 人浏览

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秒

通知函数

  1. notify_one() : 没有参数, 用于唤醒等待在条件变量上的单个线程。
  2. notify_all() : 没有参数, 用于唤醒等待在条件变量上的所有线程。
笔记
Theme Jasmine by Kent Liao