std::condition_variable
来自 cppreference.cn
在头文件 <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
是一个 StandardLayoutType。它不可 CopyConstructible、不可 MoveConstructible、不可 CopyAssignable,也不可 MoveAssignable。
目录 |
[编辑] 嵌套类型
名称 | 定义 |
native_handle_type
|
实现定义 |
[编辑] 成员函数
构造对象 (public member function) | |
析构对象 (public member function) | |
operator= [已删除] |
不可复制赋值 (public member function) |
通知 (Notification) | |
通知一个等待线程 (public member function) | |
通知所有等待线程 (public member function) | |
等待 (Waiting) | |
阻塞当前线程直到条件变量被唤醒 (public member function) | |
阻塞当前线程,直到条件变量被唤醒或达到指定的超时时长。 (public member function) | |
阻塞当前线程,直到条件变量被唤醒或达到指定的时间点。 (public member function) | |
原生句柄 | |
返回原生句柄 (public member function) |
[编辑] 示例
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() { // wait until main() sends data std::unique_lock lk(m); cv.wait(lk, []{ return ready; }); // after the wait, we own the lock std::cout << "Worker thread is processing data\n"; data += " after processing"; // send data back to main() processed = true; std::cout << "Worker thread signals data processing completed\n"; // manual unlocking is done before notifying, to avoid waking up // the waiting thread only to block again (see notify_one for details) lk.unlock(); cv.notify_one(); } int main() { std::thread worker(worker_thread); data = "Example data"; // send data to the worker thread { std::lock_guard lk(m); ready = true; std::cout << "main() signals data ready for processing\n"; } cv.notify_one(); // wait for the worker { 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) |
提供与任意锁类型关联的条件变量 (class) |
(C++11) |
提供基本的互斥设施 (class) |
(C++11) |
实现严格基于作用域的互斥体所有权包装器 (class template) |
(C++11) |
实现可移动的互斥体所有权包装器 (class template) |