• c++11 多线程支持 条件变量(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 ,在与用于保护共享变量者相同的互斥上
    2. 执行 wait 、 wait_for 或 wait_until ,等待操作自动释放互斥,并悬挂线程的执行。
    3. condition_variable 被通知时,时限消失或虚假唤醒发生,线程被唤醒,且自动重获得互斥。之后线程应检查条件,若唤醒是虚假的,则继续等待。

    std::condition_variable 只可与 std::unique_lock 一同使用;此限制在一些平台上允许最大效率。 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) 。

    构造函数

    1. condition_variable(); (1) (C++11 起)
    2. 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 。

    参数

    (无)

    返回值

    此条件变量的原生句柄。

  • 相关阅读:
    若依框架解读(前后端分离版)—— 1.Spring Security相关配置(@Anonymous注解)
    Go语言学习笔记—golang包管理
    常见上下文切换场景
    C++的哈希 && 哈希表 && 哈希桶
    STL Array、ForwardList源码剖析
    OpenCV+QT5在Window下的环境配置记录
    【力扣每日一题】2023.9.5 从两个数字数组里生成最小数字
    现在都这么狂吗?面试了一个工作4年的测试工程师,一问连自动化基础都不清楚,还反过来怼我....
    el-tree实现表格方式菜单
    微软推出的Microsoft Fabric 到底是什么?
  • 原文地址:https://blog.csdn.net/qq_40788199/article/details/126435885