admin管理员组

文章数量:1599529

定义于头文件 <condition_variable>

条件变量是允许多个线程相互交流的同步原语。它允许一定量的线程等待(可以定时)另一线程的提醒,然后再继续。条件变量始终关联到一个互斥。

class condition_variable;        (C++11 起) 

condition_variable 类是同步原语,能用于阻塞一个线程,或同时阻塞多个线程,直至另一线程修改共享变量(条件)并通知 condition_variable

有意修改变量的线程必须

  1. 获得 std::mutex (典型地通过 std::lock_guard )
  2. 在保有锁时进行修改
  3. std::condition_variable 上执行 notify_one 或 notify_all (不需要为通知保有锁)

即使共享变量是原子的,也必须在互斥下修改它,以正确地发布修改到等待的线程。

任何有意在 std::condition_variable 上等待的线程必须

  1. 获得 std::unique_lock<std::mutex> ,在与用于保护共享变量者相同的互斥上
  2. 执行 wait 、 wait_for 或 wait_until ,等待操作自动释放互斥,并悬挂线程的执行。
  3. 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 。

参数

(无)

返回值

此条件变量的原生句柄。

本文标签: 变量多线程条件conditionvariable