std:: condition_variable
|
定义于头文件
<condition_variable>
|
||
|
class
condition_variable
;
|
(C++11 起) | |
std::condition_variable
是一种同步原语,需与
std::mutex
配合使用,用于阻塞一个或多个线程,直到另一个线程既修改了共享变量(即
条件
)又通知了该
std::condition_variable
。
打算修改共享变量的线程必须:
- 获取一个 std::mutex (通常通过 std::lock_guard )。
- 在持有锁期间修改共享变量。
-
在
std::condition_variable上调用 notify_one 或 notify_all (可在释放锁之后执行)。
即使共享变量是原子类型,也必须在持有互斥锁时进行修改,以 正确 地将修改发布给等待线程。
任何打算等待
std::condition_variable
的线程必须:
- 获取用于保护共享变量的互斥锁上的 std:: unique_lock < std:: mutex > 。
- 执行以下操作之一:
-
- 检查条件,以防它已被更新并通知。
-
在
std::condition_variable上调用 wait 、 wait_for 或 wait_until (原子地释放互斥锁并暂停线程执行,直到条件变量被通知、超时到期或发生 伪唤醒 ,然后在返回前原子地获取互斥锁)。 - 检查条件,如果不满足则恢复等待。
- 或者:
- 使用 wait 、 wait_for 和 wait_until 的谓词重载版本,它们执行相同的三个步骤。
std::condition_variable
仅能与
std::
unique_lock
<
std::
mutex
>
配合使用,这种设计在某些平台上能实现最高效率。
std::condition_variable_any
则提供了可与任何
BasicLockable
对象(例如
std::shared_lock
)配合使用的条件变量。
条件变量允许并发调用 wait 、 wait_for 、 wait_until 、 notify_one 和 notify_all 成员函数。
类
std::condition_variable
属于
标准布局类型
。它不满足
可复制构造
、
可移动构造
、
可复制赋值
或
可移动赋值
的要求。
目录 |
嵌套类型
| 名称 | 定义 |
native_handle_type
|
由实现定义 |
成员函数
|
构造对象
(公开成员函数) |
|
|
析构对象
(公开成员函数) |
|
|
operator=
[deleted]
|
不可复制赋值
(公开成员函数) |
通知 |
|
|
通知一个等待线程
(公开成员函数) |
|
|
通知所有等待线程
(公开成员函数) |
|
等待 |
|
|
阻塞当前线程直至条件变量被唤醒
(公开成员函数) |
|
|
阻塞当前线程直至条件变量被唤醒或超过指定时限
(公开成员函数) |
|
|
阻塞当前线程直至条件变量被唤醒或抵达指定时间点
(公开成员函数) |
|
原生句柄 |
|
|
返回原生句柄
(公开成员函数) |
|
示例
std::condition_variable
通常与
std::mutex
结合使用,以实现线程间通信。
#include <condition_variable> #include <iostream> #include <mutex> #include <string> #include <thread> std::mutex m; std::condition_variable cv; std::string data; bool ready = false; bool processed = false; void worker_thread() { // 等待主线程发送数据 std::unique_lock lk(m); cv.wait(lk, []{ return ready; }); // 等待结束后,我们持有锁 std::cout << "Worker thread is processing data\n"; data += " after processing"; // 将数据传回主线程 processed = true; std::cout << "Worker thread signals data processing completed\n"; // 在通知前手动解锁,避免唤醒等待线程后其再次阻塞(详见 notify_one) lk.unlock(); cv.notify_one(); } int main() { std::thread worker(worker_thread); data = "Example data"; // 向工作线程发送数据 { std::lock_guard lk(m); ready = true; std::cout << "main() signals data ready for processing\n"; } cv.notify_one(); // 等待工作线程完成 { std::unique_lock lk(m); cv.wait(lk, []{ return processed; }); } std::cout << "Back in main(), data = " << data << '\n'; worker.join(); }
输出:
main() signals data ready for processing Worker thread is processing data Worker thread signals data processing completed Back in main(), data = Example data after processing
参见
|
(C++11)
|
提供与任意锁类型关联的条件变量
(类) |
|
(C++11)
|
提供基本互斥设施
(类) |
|
(C++11)
|
实现严格基于作用域的互斥所有权包装器
(类模板) |
|
(C++11)
|
实现可移动的互斥所有权包装器
(类模板) |