定义于头文件 <condition_variable>
条件变量是允许多个线程相互交流的同步原语。它允许一定量的线程等待(可以定时)另一线程的提醒,然后再继续。条件变量始终关联到一个互斥。
class condition_variable; (C++11 起)
condition_variable
类是同步原语,能用于阻塞一个线程,或同时阻塞多个线程,直至另一线程修改共享变量(条件)并通知 condition_variable
。
有意修改变量的线程必须
- 获得
std::mutex
(典型地通过 std::lock_guard ) - 在保有锁时进行修改
- 在
std::condition_variable
上执行 notify_one 或 notify_all (不需要为通知保有锁)
即使共享变量是原子的,也必须在互斥下修改它,以正确地发布修改到等待的线程。
任何有意在 std::condition_variable
上等待的线程必须
- 获得 std::unique_lock<std::mutex> ,在与用于保护共享变量者相同的互斥上
- 执行 wait 、 wait_for 或 wait_until ,等待操作自动释放互斥,并悬挂线程的执行。
- condition_variable 被通知时,时限消失或虚假唤醒发生,线程被唤醒,且自动重获得互斥。之后线程应检查条件,若唤醒是虚假的,则继续等待。
std::condition_variable
只可与 std::unique_lock<std::mutex> 一同使用;此限制在一些平台上允许最大效率。 std::condition_variable_any 提供可与任何基本可锁定 (BasicLockable) 对象,例如 std::shared_lock 一同使用的条件变量。
condition_variable 容许 wait 、 wait_for 、 wait_until 、 notify_one 及 notify_all 成员函数的同时调用。
类 std::condition_variable
是标准布局类型 (StandardLayoutType) 。它不可复制构造 (CopyConstructible) 、可移动构造 (MoveConstructible) 、可复制赋值 (CopyAssignable) 或可移动赋值 (MoveAssignable) 。
构造函数
condition_variable(); (1) (C++11 起)
condition_variable(const condition_variable&) = delete; (2) (C++11 起)
1) 构造 std::condition_variable
类型对象。
2) 复制构造函数被删除。
参数
(无)
异常
1) 可能抛出 std::system_error ,其 std::error_condition 若线程无权限创建条件变量,则等于 std::errc::operation_not_permitted ,若非内存资源限制阻止此初始化,则等于 std::errc::resource_unavailable_try_again ,或其他实现定义值。
析构函数
~condition_variable(); (1) (C++11 起)
销毁 std::condition_variable 类型对象。
若已通知所有线程,调用析构函数才是安全的。不要求它们已退出其对应的等待函数:一些线程仍然可等待重获得关联锁,或在重获得后等待被调度到运行。
一旦析构函数开始,程序员就必须确保没有线程试图等待在 *this 上,特别是在等待线程在循环中调用等待函数,或使用接收谓词的等待函数的重载时。
异常
(无)
返回原生句柄
native_handle_type native_handle(); (C++11 起)
访问 *this 的原生句柄。
此函数结果的含义和类型是实现定义的。 POSIX 系统上,这可以是 pthread_cond_t* 类型值。 Windows 系统上,这可以是 PCONDITION_VARIABLE 。
参数
(无)
返回值
此条件变量的原生句柄。