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.mfbz.cn/a/782250.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

14-39 剑和诗人13 - 顶级大模型测试分析和建议

​​​​​ 随着对高级语言功能的需求不断飙升&#xff0c;市场上涌现出大量语言模型&#xff0c;每种模型都拥有独特的优势和功能。然而&#xff0c;驾驭这个错综复杂的生态系统可能是一项艰巨的任务&#xff0c;开发人员和研究人员经常面临选择最适合其特定需求的模型的挑战。…

React中的useMemo和memo

引言 React是一个声明式的JavaScript库&#xff0c;用于构建用户界面。在开发过程中&#xff0c;性能优化是一个重要的方面。useMemo和memo是React提供的工具&#xff0c;用于帮助开发者避免不必要的渲染和计算&#xff0c;从而提升应用性能。 问题背景 在React应用中&#…

Golang | Leetcode Golang题解之第214题最短回文串

题目&#xff1a; 题解&#xff1a; func shortestPalindrome(s string) string {n : len(s)fail : make([]int, n)for i : 0; i < n; i {fail[i] -1}for i : 1; i < n; i {j : fail[i - 1]for j ! -1 && s[j 1] ! s[i] {j fail[j]}if s[j 1] s[i] {fail[i…

【密码学】密码学中的四种攻击方式和两种攻击手段

在密码学中&#xff0c;攻击方式通常指的是密码分析者试图破解加密信息或绕过安全机制的各种策略。根据密码分析者对明文、密文以及加密算法的知识程度&#xff0c;攻击可以分为以下四种基本类型&#xff1a; 一、四种攻击的定义 &#xff08;1&#xff09;唯密文攻击(COA, C…

MySQL学习(7):4种常用函数

1.字符串函数 mysql中内置了很多字符串函数&#xff0c;常用的几种如下&#xff1a; concat(s1,s2,s3...)字符串拼接&#xff0c;将s1,s2,s3...拼接成一个字符串 lower(s1) 将字符串s1全部转为小写upper(s1)将字符串s1全部转为大写lpad(s1,5,*) 如果字符串s1不足5位&#xff…

对BSV区块链的曼达拉网络通俗易懂的解释

​​发表时间&#xff1a;2023年6月15日 BSV区块链正在引入“曼达拉”升级&#xff0c;使BSV区块链网络的拓扑结构能够适配Teranode&#xff0c;适配这个可以大幅扩容的节点软件。BSV区块链上曼达拉网络的概念并不会改变整个系统的核心规则&#xff1b;相反&#xff0c;它能够引…

vue3使用方式汇总

1、引入iconfont阿里图库图标&#xff1a; 1.1 进入阿里图标网站&#xff1a; iconfont阿里&#xff1a;https://www.iconfont.cn/ 1.2 添加图标&#xff1a; 1.3 下载代码&#xff1a; 1.4 在vue3中配置代码&#xff1a; 将其代码复制到src/assets/fonts/目录下&#xff1…

Python打开Excel文档并读取数据

Python 版本 目前 Python 3 版本为主流版本&#xff0c;这里测试的版本是&#xff1a;Python 3.10.5。 常用库说明 Python 操作 Excel 的常用库有&#xff1a;xlrd、xlwt、xlutils、openpyxl、pandas。这里主要说明下 Excel 文档 .xls 格式和 .xlsx 格式的文档打开和读取。 …

python爬虫入门(三)之HTML网页结构

一、什么是HTML 1、网页的三大技术要素&#xff1a; HTML定义网页的结构和信息&#xff08;骨架血肉&#xff09;CSS定义网页的样式&#xff08;衣服&#xff09;JavaScript定义用户和网页的交互逻辑&#xff08;动作&#xff09; 2、一个最简单的HTML&#xff1a;用<>…

【TB作品】51单片机 Proteus仿真 超声波读取+LCD1602显示仿真12MHZ

实验报告&#xff1a;51单片机 Proteus仿真 超声波读取LCD1602显示仿真 一、实验背景 本实验旨在使用51单片机&#xff08;AT89C51&#xff09;结合超声波传感器HC-SR04和LCD1602液晶显示屏&#xff0c;通过Proteus仿真平台实现超声波测距功能&#xff0c;并将测得的距离显示…

基于Python API的机械臂UDP上报设置及读取

睿尔曼机械臂提供了1个可持续读取机械臂状态的接口&#xff0c;UDP通信状态反馈接口。 该接口提供了json协议、API的读取&#xff0c;设置通信开启之后无需再进行设置即可以固定频率读取。 Python程序源码可从以下网盘地址获取&#xff08;地址永久有效&#xff09;&#xff1…

排序(2)

我们在排序&#xff08;1&#xff09;中说到选择排序的代码&#xff1a; void SelectSort(int* a,int n) {int begin0,endn-1;int minibegin,maxbegin;for(int ibegin1;i<end;i){if(a[i]>a[max]){maxii;}if(a[i]<a[mini]){minii;}begin;--end;}Swap(&a[beign],&a…

【NTN 卫星通信】Starlink基于终端用户的测量以及测试概述

1 概述 收集了一些starlink的资料&#xff0c;是基于终端侧部署在野外的一些测试以及测量结果。 2 低地球轨道卫星网络概述 低地球轨道卫星网络(lsn)被认为是即将到来的6G中真正实现全球覆盖的关键基础设施。本文介绍了我们对Starlink端到端网络特征的初步测量结果和观测结果&…

澳大利亚媒体发稿:怎样用图表提高易读性?-华媒舍

媒体发稿的可读性变得尤为重要。读者们不会再有时间与耐心去阅读文章繁琐的文本&#xff0c;他们更喜欢简洁明了的信息展现形式&#xff0c;在其中图表是一种极为高效的专用工具。下面我们就详细介绍怎么使用图表提高澳大利亚新闻媒体发稿的可读性&#xff0c;以适应读者的需要…

day01:项目概述,环境搭建

文章目录 软件开发整体介绍软件开发流程角色分工软件环境 外卖平台项目介绍项目介绍定位功能架构 产品原型技术选型 开发环境搭建整体结构&#xff1a;前后端分离开发前后端混合开发缺点前后端分离开发 前端环境搭建Nginx 后端环境搭建熟悉项目结构使用Git进行版本控制数据库环…

VSCode使用SSH无需输入密码远程连接服务器

目录 一、密钥生成 1、使用windows11自带的命令行 2、使用putty工具 二、查看密钥 三、设置服务器 这个过程是比较简单的&#xff0c;为了方便后续留用和查看&#xff0c;整理个笔记放着。 一、密钥生成 1、使用windows11自带的命令行 在任一文件夹中&#xff0c;空白处…

2024世界人工智能大会,神仙打架

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 AI圈最近又发生了啥新鲜事&#xff1f; 该栏目以周更频率总结国内外前沿AI动态&#xff0c;感兴趣的可以点击订阅合集以及时收到最新推送 B站首秀世界人工智能大会&#xff0c;展示自研AI技术与AIGC…

世界人工智能大会中“数据+标注”相关的关键词浅析

标注猿的第79篇原创 一个用数据视角看AI世界的标注猿 大家好&#xff0c;我是AI数据标注猿刘吉&#xff0c;一个用数据视角看AI世界的标注猿。 在国家级数据标注基地建设任务下发后的两个月时间里&#xff0c;全国各地政府、各个高校都快速行动了起来&#xff0c;数据行…

Win10如何设置远程桌面?

远程桌面介绍 远程桌面是一款Windows提供的远程工具&#xff0c;旨在连接同一局域网内的两台计算机。如果您掌握被控端电脑的IP地址&#xff0c;便可直接连接到这台已启用远程桌面的计算机&#xff0c;通过远程桌面进行文件传输或提供远程技术支持。 在同一家公司内&#xff0…

关于 Qt在国产麒麟系统上设置的setFixedSize、setMinimumFixed、setMaxmumFixed设置无效 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140242881 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…