【C++多线程】std::condition_variable到底是什么

2024年6月29日,周日下午


std::condition_variable 是C++11标准库中用于线程同步的一个设施,它通常与 std::unique_lockstd::mutex 结合使用,允许一个线程在某些条件成立之前挂起(等待),而另一个线程可以通知(唤醒)等待的线程。

以下是 std::condition_variable 的一些基本特点和使用场景:

  1. 基本概念
    • std::condition_variable 本身不提供任何互斥机制,它依赖于外部提供的互斥锁(通常是 std::mutex)来保证线程安全。
    • 它允许线程在某个条件尚未满足时暂停执行,并且可以由另一个线程在条件满足时唤醒它。
  2. 使用场景
    • 当一个线程需要等待某个条件成立才能继续执行时,例如等待某个数据准备好或某个事件发生。
    • 当一个线程需要通知一个或多个正在等待的线程某个条件已经满足时。
  3. 主要方法
    • wait(std::unique_lock<std::mutex>& lock):挂起当前线程,直到另一个线程调用 notify_one()notify_all()。调用时需要提供一个互斥锁的引用,该锁将在等待期间被解锁,并在唤醒后自动重新锁定。
    • wait(std::unique_lock<std::mutex>& lock, std::function<bool()> pred):与上面的 wait 方法类似,但它接受一个条件判断函数 pred。线程将等待直到 pred() 返回 true
    • notify_one():唤醒一个正在等待的线程(如果有)。
    • notify_all():唤醒所有正在等待的线程。
  4. 示例
    #include <iostream>
    #include <thread>
    #include <mutex>
    #include <condition_variable>
    std::mutex mtx;
    std::condition_variable cv;
    bool ready = false;
    void prepare() {std::unique_lock<std::mutex> lock(mtx);// 准备工作...ready = true;cv.notify_one(); // 唤醒一个等待的线程
    }
    void process() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, []{return ready;}); // 等待条件成立// 处理工作...
    }
    int main() {std::thread t1(prepare);std::thread t2(process);t1.join();t2.join();return 0;
    }
    
    在这个例子中,process 函数会等待 prepare 函数设置 readytrueprepare 函数完成后会通知 process 函数继续执行。
    std::condition_variable 是一种强大的同步机制,它使得线程间的协调变得更加灵活和高效,避免了不必要的CPU资源的浪费。

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

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

相关文章

基于MDEV的PCI设备虚拟化DEMO实现

利用周末时间做了一个MDEV虚拟化PCI设备的小试验&#xff0c;简单记录一下&#xff1a; DEMO架构&#xff0c;此图参考了内核文档&#xff1a;Documentation/driver-api/vfio-mediated-device.rst host kernel watchdog pci driver: #include <linux/init.h> #include …

【网络架构】keepalive

目录 一、keepalive基础 1.1 作用 1.2 原理 1.3 功能 二、keepalive安装 2.1 yum安装 2.2 编译安装 三、配置文件 3.1 keepalived相关文件 3.2 主配置的组成 3.2.1 全局配置 3.2.2 配置虚拟路由器 四、实际操作 4.1 lvskeepalived高可用群集 4.2 keepalivedngi…

Transformer 模型的详细配置---归一化、位置、激活函数和注意力机制

文章目录 归一化方法激活函数位置编码注意力机制归一化方法 大语言模型的预训练过程中经常会出现不稳定的问题。为了应对这一问题,深度学习方法通常会采用特定的归一化策略来加强神经网络训练过程的稳定性。原始的 Transformer 模型主要使用了层归一化方法(Layer Normalizati…

AI视界引擎 | ​基于 YOLOv8 和计算机视觉 CV 的实时识别系统!

本文来源公众号“AI视界引擎”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;​基于 YOLOv8 和计算机视觉 CV 的实时识别系统&#xff01; 技术进步和创新正在尽可能地推进作者的日常生活&#xff0c;但仍有很大一部分社会群体因为…

自研Eclipse插件的生成及安装和使用

说明&#xff1a; 本处是使用个人自研的Eclipse插件为例&#xff0c;创建了一个菜单式的插件组&#xff0c;插件组下&#xff0c;有一个生成右击Jakarta EE服务端点类后&#xff0c;生成端点对应的Restful客户端。有什么问题&#xff0c;欢迎大家交流&#xff01;&#xff01;…

cython 笔记

数据类型 # bool 类型 // bool_type_ptactice.pyx cdef bint a 123 # 非0 为 真 &#xff0c; 0 为假 cdef bint b -123 cdef bint c 0 py_a a # cdef 定义的内容没法直接在python中直接引用 py_b b py_c c// main.py import pyximport pyximport.install(language_le…

深度解析服务发布策略之A/B测试

A/B测试&#xff0c;作为一种科学决策方法&#xff0c;被广泛应用于产品迭代、营销策略优化、用户体验改进等多个领域&#xff0c;其核心在于通过对比实验&#xff0c;定量分析不同方案的效果差异。这种测试方法通常是将用户随机分配到两个或多个不同的版本中&#xff0c;然后收…

教您设置打开IDM下载浮动条的快捷键 全网最强下载神器idm怎么使用教程 idm浮动条不显示怎么办

很多人都知道Internet Download Manager(以下简称IDM)是一款非常优秀的下载提速软件。它功能强大&#xff0c;几乎能下载网页中的所有数据&#xff08;包括视频、音频、图片等&#xff09;&#xff0c;且适用于现在市面上几乎所有的浏览器&#xff0c;非常受大家欢迎。 在使用I…

面向对象和面向过程编程的区别

引言 小伙伴们&#xff0c;当你们看到这章的时候&#xff0c;显然你们已经跨过了来自指针给你们带来的麻烦&#xff0c;唔~真棒呢&#xff0c;但是我们只学会一些基础的C语法并不能帮我们解决问题&#xff0c;甚至是稍微难一些的题目我们都没办法解决&#xff0c;那怎么办呢&am…

多机调度问题

#include<iostream> #include<string> using namespace std; struct work {int time;int number; }; int setwork0(int m,int n,int a[],struct work w[]) {int maxtime0;for(int i1; i<m; i){cout<<i<<"号设备处理作业"<<w[i].num…

python系列30:各种爬虫技术总结

1. 使用requests获取网页内容 以巴鲁夫产品为例&#xff0c;可以用get请求获取内容&#xff1a; https://www.balluff.com.cn/zh-cn/products/BES02YF 对应的网页为&#xff1a; 使用简单方法进行解析即可 import requests r BES02YF res requests.get("https://www.…

YOLOv8改进 | 卷积模块 | 分布移位卷积DSConv替换Conv

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a;《YOLOv8改进有效…

spring mvc实现一个自定义Converter转换器

介绍 自定义转换器输入Spring MVC框架范畴&#xff0c;总体上输入Spring生态的一个特性&#xff0c;对Web开发起作用。 使用场景 在Spring Boot应用中&#xff0c;自定义转换器主要用于处理HTTP请求参数到Java对象的自动转换&#xff0c;或者Java对象到HTTP响应的序列化过程…

使用Apache Kafka 构建实时数据处理应用

简介 Apache Kafka的基本概念 Apache Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者和生产者的所有实时消息。以下是一些Apache Kafka的核心概念: Producer:生产者,消息和数据的发布者。生产者负责将数据发送到Kafka集群。 Consumer:消费者,消息和数…

2024百度之星第一场-110串

补题链接&#xff1a; 码蹄集 三个状态转移的计数dp 先确定状态 n个数至多修改k次&#xff0c;保证不出现字串“110” 常规想法先把状态确定为dp[n][k][0/1]&#xff0c;前n个数&#xff0c;修改k次后&#xff0c;末尾数为0/1&#xff0c;不能转移再换思路。 初始状态设定如…

使用ECharts创建动态数据可视化图表

使用ECharts创建动态数据可视化图表 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在现代Web应用开发中&#xff0c;数据可视化是至关重要的一环。ECharts作…

左耳听风_100_99_高效学习如何学习和阅读代码

你好&#xff0c;我是陈浩网名&#xff0c;做我个house.这节课呢我想来谈一谈如何学习和阅读代码。 杰夫阿特伍德啊说过这么一句话&#xff0c;code tell you how comments tell you why.那我把它扩展一下呢&#xff0c;就是代码会告诉你what how和details.而文档和书呢会告诉…

rk3568 rockit编译测试

前言 环境介绍&#xff1a; 1.编译环境 Ubuntu 20.04.6 LTS 2.SDK版本 rk3568_linux_5.10 3.单板 迅为itop-3568开发板 一、编译rockit组件包 rockit组件包在4.10版本需要手动编译&#xff0c;奈何我的版本怎么都编译不了&#xff0c;后来改用5.10版本才编译通过。 4.1…

存储请求地址但是使用时请求的是端口

baseURL默认全局加载一次&#xff0c;后续直接读取缓存 解决方案&#xff1a;

类和对象(封装、继承、多态、友元)

c面相对象的三大特性为&#xff1a;封装、继承、多态 c 认为万事万物都皆为对象&#xff0c;对象上有其属性和行为 一、类和对象&#xff08;封装&#xff09; &#xff08;一&#xff09;封装的意义 封装是c面相对象的三大特性之一 封装的意义&#xff1a; 将属性和行为…