condition_variable---C++条件变量

文章目录

  • 1.C++11条件变量
  • 2. 相关api方法
    • 2.1 wait方法
  • 2.2 wait_for 方法
    • 2.3 wait_until 方法
    • 2.4 notify_one 和 notify_all 方法
  • 3虚假唤醒等问题

1.C++11条件变量

 std::condition_variable 是 C++11 标准库中提供的一个类,用于在多线程环境中实现线程间的同步和通信。通常与 std::mutex(互斥锁)一起使用,以实现线程的等待和唤醒机制。

2. 相关api方法

2.1 wait方法

 wait 方法用于阻塞当前线程,直到另一个线程调用同一 condition_variable 对象的 notify_one() 或 notify_all() 方法来唤醒等待的线程。wait 方法有两种形式:
第一种

void wait(std::unique_lockstd::mutex& lock);

当前线程的执行会被阻塞,直到收到 notify 为止。在等待过程中,会自动释放与 lock 关联的互斥锁,以允许其他线程访问共享资源。当线程被唤醒后,它会自动重新获取互斥锁,然后继续执行。
第二种

template< class Predicate>
void wait(std::unique_lockstd::mutex&
lock, Predicate pred);

这是一个带谓词的版本,线程仅在 pred 返回 false 时被阻塞。如果 pred 返回 true,则线程不会被阻塞,并继续执行。这有助于避免虚假唤醒,因为线程在唤醒后会重新检查条件是否满足。

2.2 wait_for 方法

wait_for 方法用于阻塞当前线程,直到另一个线程调用 notify 方法唤醒它,或者直到指定的超时时间到达。它也有两种形式:

第一种

template<class Rep, class Period> cv_status
wait_for(std::unique_lockstd::mutex& lock, const
std::chrono::duration<Rep, Period>& rel_time);

在指定的相对时间 rel_time 内,线程被阻塞。如果在这段时间内线程被唤醒,则返回 cv_status::no_timeout;如果超时,则返回 cv_status::timeout。

第二种

template<class Rep, class Period, class Predicate> bool
wait_for(std::unique_lockstd::mutex& lock, const
std::chrono::duration<Rep, Period>& rel_time, Predicate pred);

与第一种形式类似,但增加了谓词 pred。线程仅在 pred 返回 false 时被阻塞,并且如果在超时前 pred 变为 true 或线程被唤醒,则返回 true;如果超时且 pred 仍为 false,则返回 false。

2.3 wait_until 方法

 wait_until 方法用于阻塞当前线程,直到另一个线程调用 notify 方法唤醒它,或者直到指定的绝对时间点到达。它同样有两种形式:

template<class Clock, class Duration> cv_status
wait_until(std::unique_lockstd::mutex& lock, const
std::chrono::time_point<Clock, Duration>& abs_time);

在指定的绝对时间点 abs_time 之前,线程被阻塞。如果在这段时间内线程被唤醒,则返回 cv_status::no_timeout;如果到达指定时间点仍未被唤醒,则返回 cv_status::timeout。

template<class Clock, class Duration, class Predicate> bool
wait_until(std::unique_lockstd::mutex& lock, const
std::chrono::time_point<Clock, Duration>& abs_time, Predicate pred);

与第一种形式类似,但增加了谓词 pred。线程在 pred 返回 false 且未到达 abs_time 时被阻塞。如果在这段时间内 pred 变为 true 或线程被唤醒,则返回 true;如果到达 abs_time 且 pred 仍为 false,则返回 false。

2.4 notify_one 和 notify_all 方法

void notify_one() noexcept;

唤醒等待在 condition_variable 对象上的单个线程。如果有多个线程在等待,则唤醒哪一个是不确定的。

void notify_all() noexcept;

唤醒等待在 condition_variable 对象上的所有线程。

3虚假唤醒等问题

1.std::condition_variable 必须与 std::unique_lock 一起使用,以确保在等待条件时以互斥方式访问共享资源。
2.虚假唤醒(spurious wakeup)是多线程环境中的一种正常行为,因此在使用 wait、wait_for 和 wait_until 方法时,应该总是重新检查条件是否满足,即使用while循环检查

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/42508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS7安装部署双版本MySQL

文章目录 CentOS7安装部署双版本MySQL一、前言1.场景2.环境 二、安装MySQL 5.6三、安装MySQL 8.01. 解压并移动 MySQL 文件2. 创建并配置 my.cnf3.修改mysql.server4. 添加用户组和用户5. 初始化 MySQL 数据目录6. 创建systemd服务文件7.创建符号链接8.首次登录9.允许所有主机连…

初中物理知识点总结(人教版)

初中物理知识点大全 声现象知识归纳 1 .声音的发生&#xff1a;由物体的振动而产生。振动停止&#xff0c;发声也停止。 2.声音的传播&#xff1a;声音靠介质传播。真空不能传声。通常我们听到的声音是靠空气传来的。 3.声速&#xff1a;在空气中传播速度是&#xff1a;340…

【2024_CUMCM】T检验、F检验、卡方检验

T检验 T检验主要用于比较两组数据的均值差异&#xff0c;适用于小样本数据分析。它可以分为单样本T检验、独立样本T检验和配对样本T检验。 单样本T检验用于比较一个样本与已知的总体均值差异&#xff0c;独立样本T检验用于比较两个独立样本的均值差异&#xff0c;配对样本T检…

【Transformer】transformer模型结构学习笔记

文章目录 1. transformer架构2. transformer子层解析3. transformer注意力机制4. transformer部分释疑 图1 transformer模型架构 图2 transformer主要模块简介 图3 encoder-decoder示意图N6 图4 encoder-decoder子层示意图 1. transformer架构 encoder-decoder框架是一种处理NL…

【Android】自定义换肤框架04之Skinner框架设计

到上一章为止&#xff0c;我们已经完整讲解了换肤所用到的所有技术点 这一章&#xff0c;我们来梳理下&#xff0c;如何从整体和细节上&#xff0c;进行代码设计 毕竟&#xff0c;我们不止是简单实现功能&#xff0c;要做到功能清晰&#xff0c;使用灵活 文章目录 核心组件使…

探索InitializingBean:Spring框架中的隐藏宝藏

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索MYSQL索引数据结构之旅✨ &#x1f44b; Spring框架的浩瀚海洋中&#x…

Java里的Arrary详解

DK 中提供了一个专门用于操作数组的工具类&#xff0c;即Arrays 类&#xff0c;位于java.util 包中。该类提供了一些列方法来操作数组&#xff0c;如排序、复制、比较、填充等&#xff0c;用户直接调用这些方法即可不需要自己编码实现&#xff0c;降低了开发难度。 java.util.…

用PlantUML和语雀画UML类图

概述 首先阐述一下几个简单概念&#xff1a; UML&#xff1a;是统一建模语言&#xff08;Unified Modeling Language&#xff09;的缩写&#xff0c;它是一种用于软件工程的标准化建模语言&#xff0c;旨在提供一种通用的方式来可视化软件系统的结构、行为和交互。UML由Grady…

用于实时语义分割的可重参数化双分辨率网络

文章目录 摘要一、引言II、相关工作III、方法IV. 实验V、结论摘要 https://arxiv.org/pdf/2406.12496 语义分割在自动驾驶和医学图像等应用中发挥着关键作用。尽管现有的实时语义分割模型在准确性和速度之间取得了令人称赞的平衡,但其多路径块仍然影响着整体速度。为了解决这…

洛谷 P2141 [NOIP2014 普及组] 珠心算测验

本文由Jzwalliser原创&#xff0c;发布在CSDN平台上&#xff0c;遵循CC 4.0 BY-SA协议。 因此&#xff0c;若需转载/引用本文&#xff0c;请注明作者并附原文链接&#xff0c;且禁止删除/修改本段文字。 违者必究&#xff0c;谢谢配合。 个人主页&#xff1a;blog.csdn.net/jzw…

pyrender 离线渲染包安装教程

pyrender 离线渲染包安装教程 安装 安装 官方安装教程:https://pyrender.readthedocs.io/en/latest/install/index.html#installmesa 首先 pip install pyrenderclang6.0安装 下载地址:https://releases.llvm.org/download.html#6.0.0 注意下好是叫&#xff1a;clangllvm-6…

名企面试必问30题(二十三)—— 工作中难以和同事、上司相处,你该怎么办?

回答方向一 如果在工作中遇到与同事、上司难以相处的情况&#xff0c;我首先会保持冷静和积极的心态&#xff0c;不让情绪影响到工作。我会反思自己的行为和态度&#xff0c;分析产生矛盾或难以相处的原因。 如果是因为工作方式、方法上存在差异&#xff0c;我会主动找同事或上…

通信协议_C#实现自定义ModbusRTU主站

背景知识&#xff1a;modbus协议介绍 相关工具 mbslave:充当从站。虚拟串口工具:虚拟出一对串口。VS2022。 实现过程以及Demo 打开虚拟串口工具: 打开mbslave: 此处从站连接COM1口。 Demo实现 创建DLL库&#xff0c;创建ModbusRTU类,进行实现&#xff1a; using Syste…

VMware虚拟机搭建CentOS7环境

相关资料 安装VMware 双击VMware-workstation(16.1.1软件安装包.exe安装文件,点下一步 激活码文件复制激活码激活安装linux 1、点击创建虚拟机

SLAM(Simultaneous Localization and Mapping)算法

SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;算法&#xff0c;即同时定位与地图构建算法&#xff0c;是一种通过传感器数据实时估计机器人自身位置和构建环境地图的技术。该算法广泛应用于机器人、自动驾驶、增强现实&#xff08;AR&#xff09;、无人机…

【MySQL基础篇】多表查询

1、多表关系 概述&#xff1a;项目开发中&#xff0c;在进行数据库表结构操作设计时&#xff0c;会根据业务需求及业务模板之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分为三种…

从FasterTransformer源码解读开始了解大模型(2.1)代码通读03

从FasterTransformer源码解读开始了解大模型&#xff08;2.2&#xff09;代码解读03-forward函数 写在前面的话 本篇的内容继续解读forward函数&#xff0c;从650行开始进行解读 零、输出Context_embeddings和context_cum_log_probs的参数和逻辑 从653行开始&#xff0c;会…

架构师学习理解和总结

1.架构设计理念 2.架构方法论 2.1需求分析 2.1.1常见需求层次 2.1.2 常见需求结果 2.1.3 需求与架构关系 2.2 领域分析 2.3 关键需求 2.4 概念架构设计 2.5 细化架构设计 2.6 架构设计验证 3.架构设计工具 3.1 DDD领域建模 3.2 41视图分析法 3.3 UML设计工具 4.架构师知…

【PYG】pytorch中size和shape有什么不同

一般使用tensor.shape打印维度信息&#xff0c;因为简单直接 在 PyTorch 中&#xff0c;size 和 shape 都用于获取张量的维度信息&#xff0c;但它们之间有细微的区别。下面是它们的定义和用法&#xff1a; size&#xff1a; size 是一个方法&#xff08;size()&#xff09;和…

系统化学习 H264视频编码(01)基础概念

说明&#xff1a;我们参考黄金圈学习法&#xff08;什么是黄金圈法则?->模型 黄金圈法则&#xff0c;本文使用&#xff1a;why-what&#xff09;来学习音H264视频编码。本系列文章侧重于理解视频编码的知识体系和实践方法&#xff0c;理论方面会更多地讲清楚 音视频中概念的…