C++11中的Condition_variable

C++11中的condition_variable

在C++11中,条件变量(std::condition_variable)是线程同步机制之一,用于在多线程环境中实现线程间的通信和协调。它允许一个或多个线程在某个条件尚未满足时等待,直到其他线程通知条件已经满足。条件变量通常与互斥锁(std::mutex)一起使用,以确保线程安全。

1. 包含头文件

在使用条件变量之前,需要包含 <condition_variable><mutex> 头文件:

#include <condition_variable>
#include <mutex>

2. 声明条件变量和互斥锁

条件变量需要与互斥锁配合使用,互斥锁用于保护共享资源,条件变量用于线程间的同步。

std::mutex mtx; // 互斥锁
std::condition_variable cv;  // 条件变量

3. 等待条件

线程可以通过 cv.wait()cv.wait_for() 等方法等待条件满足。cv.wait() 需要一个互斥锁作为参数,并且会自动释放互斥锁,直到条件变量被通知为止。在等待期间,线程会被阻塞。

std::unique_lock<std::mutex> lock(mtx); // 加锁
cv.wait(lock,[](){return condition;  };);// 等待条件满足

  • condition 是一个布尔表达式,用于判断是否满足等待条件。
  • std::unique_lock 是一种更灵活的互斥锁,支持延迟加锁和解锁。

4. 通知条件

当条件满足时,可以通过 cv.notify_one()cv.notify_all() 唤醒等待的线程:

  • cv.notify_one():唤醒一个等待的线程。
  • cv.notify_all():唤醒所有等待的线程。

示例代码

以下是一个完整的示例,展示了如何使用条件变量实现生产者-消费者模型:

#include <iostream>
#include<mutex>
#include<condition_variable>
#include<thread>
#include<queue>
using namespace std;

std::queue<int> que; // 共享队列
std::mutex mtx;      // 互斥锁
std::condition_variable cv; // 条件变量

// 生产者线程
void Producer()
{
    for (int i = 0; i < 10; i++)
    {
        std::unique_lock<std::mutex> lock(mtx); // 加锁
        que.push(i); // 生产数据
        cout << "Producer " << i << endl;
        lock.unlock();
        cv.notify_one(); // 通知消费者
        std:this_thread::sleep_for(std::chrono::milliseconds(100));
    }
}

// 消费者线程
void Customer()
{
    while (true)
    {
        std::unique_lock<std::mutex> lock(mtx); // 加锁
        cv.wait(lock, []() {return !que.empty(); }); // 等待队列非空
        int nValue = que.front(); // 消费数据
        que.pop();
        std::cout << "customer " << nValue << endl;
        if (nValue == 9)
            break;
        lock.unlock();
        std:this_thread::sleep_for(std::chrono::milliseconds(100));
    }
}

int main()
{
    std::thread th1(Producer);
    std::thread th2(Customer);
    th1.join();
    th2.join();

    std::cout << "Hello World!\n";
}

代码运行结果:

微信截图_20250309194128

注意事项

  1. 条件变量必须与互斥锁配合使用,否则会导致未定义行为。
  2. 虚假唤醒cv.wait() 可能会因为虚假唤醒而被触发,因此需要在等待条件中使用循环或条件表达式来确保条件真正满足。
  3. 线程安全:在使用条件变量时,必须确保共享资源的访问是线程安全的,通常通过互斥锁来保护共享资源。

通过合理使用条件变量,可以实现高效的线程同步和通信,适用于生产者-消费者、线程池等多种场景。

说明:以上代码来自kimi AI助手。

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

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

相关文章

ROS2-话题学习

强烈推荐教程&#xff1a; 《ROS 2机器人开发从入门到实践》3.2.2订阅小说并合成语音_哔哩哔哩_bilibili 构建功能包 # create package demo_python_pkg ros2 pkg create --build-type ament_python --license Apache-2.0 demo_python_pkg 自己写的代码放在./demo_python_pkg/…

深度学习模型Transformer核心组件—前馈网络FFN

第一章&#xff1a;人工智能之不同数据类型及其特点梳理 第二章&#xff1a;自然语言处理(NLP)&#xff1a;文本向量化从文字到数字的原理 第三章&#xff1a;循环神经网络RNN&#xff1a;理解 RNN的工作机制与应用场景(附代码) 第四章&#xff1a;循环神经网络RNN、LSTM以及GR…

Helm安装chart包到k8s报错“不能重复使用名称,名称已被使用”

一、报错提示如下 “Error: INSTALLATION FAILED: cannot re-use a name that is still in use”,意思是安装chart时提供的名称已存在&#xff0c;不能重复使用同一个名称。 登录后复制 rootiZ:/usr/local/src/my-helm-repo/charts# helm install mymemcached3 memcached -n te…

容器编排革命:从 Docker Run 到 Docker Compose 的进化之路20250309

容器编排革命&#xff1a;从 Docker Run 到 Docker Compose 的进化之路 一、容器化部署的范式转变 在 Docker 生态系统的演进中&#xff0c;容器编排正从“手动操作”走向“自动化管理”。根据 Docker 官方 2023 年开发者调查报告&#xff0c;78% 的开发者已采用 Docker Compo…

对开源VLA sota π0的微调——如何基于各种开源数据集、以及你自己的私有数据集微调π0(含我司的微调实践)

前言 25年2.4日&#xff0c;几个月前推出π0的公司Physical Intelligence (π)宣布正式开源π0及π0-FAST&#xff0c;如之前所介绍的&#xff0c;他们对用超过 10,000 小时的机器人数据进行了预训练 该GitHub代码仓库「 π0及π0-FAST的GitHub地址&#xff1a;github.com/Ph…

VBA使用fso对象合并指定路径的txt文件(含子目录)

图(1) 前几天我跟大家分享了在VBA中如何获取指定类型文件的路径的方法&#xff0c;其中最重要的一个思路就是在处理完当前目录的文件后&#xff0c;再调用程序自身来对子目录进行处理&#xff0c;以此来实现对子目录的无限循环&#xff0c;直至所有文件都处理完毕为止。按照此设…

nginx反向代理功能

如上图所示&#xff0c;当配置好nginx反向代理服务器的时候&#xff0c;客户端向nginx反向代理服务器发送请求&#xff0c;nginx反向代理服务器再向真实服务器转发请求。 nginx作为反向代理就是利用nginx高并发&#xff0c;速度快的特性&#xff0c;让nginx能够承受更多的链接…

deepseek在pycharm中的配置和简单应用

对于最常用的调试python脚本开发环境pycharm&#xff0c;如何接入deepseek是我们窥探ai代码编写的第一步&#xff0c;熟悉起来总没坏处。 1、官网安装pycharm社区版&#xff08;免费&#xff09;&#xff0c;如果需要安装专业版&#xff0c;需要另外找破解码。 2、安装Ollama…

【江协科技STM32】ADC数模转换器-学习笔记

ADC简介 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁&#xff0c;ADC是一种将连续的模拟信号转换为离散的数字信号的设备或模块12位逐次逼近型…

八卡5090服务器首发亮相!

AI 人工智能领域热度居高不下。OpenAI 的 GPT - 4 凭强悍语言处理能力&#xff0c;在内容创作、智能客服等领域广泛应用。清华大学团队的 DeepSeek 大模型在深度学习训练优势突出&#xff0c;正促使各行业应用端算力需求向推理主导转变&#xff0c;呈爆发式增长 。 随着 DeepS…

hadoop集群环境配置

目录 VMware虚拟机安装 Xshell安装 网络问题 centos7下载 ---------参考以下视频步骤进行生态搭建---------- 搭建好hadoop01 克隆出hadoop02、hadoop03 启动三台虚拟机 打开终端 输入 记录下各个ip 打开Xshell&#xff0c;新建会话 修改主机名 配置静态IP 主机名称…

【GPU】什么是NCCL和Simple, LL, LL128通信协议

​​​​​​​什么是NCCL 简介 NCCL 的原理 机器内通信&#xff1a; 机器间通信&#xff1a; NCCL通信协议 简介 NCCL通信选择协议规则 ​​​​​​​1 自动选择 ​​​​​​​2 强制选择 Simple协议 1 介绍 2 Simple 协议的基本格式 2 Simple 协议的示例 Sim…

aws(学习笔记第三十一课) aws cdk深入学习(batch-arm64-instance-type)

aws(学习笔记第三十一课) aws cdk深入学习 学习内容&#xff1a; 深入练习aws cdk下部署batch-arm64-instance-type 1. 深入练习aws cdk下部署batch-arm64-instance-type 代码链接 代码链接 代码链接 -> batch-arm64-instance-type之前代码学习 之前学习代码链接 -> aw…

单细胞多数据集整合和去除批次效应教程,代做各领域生信分析

单细胞多数据集整合和去除批次效应教程 每个数据集的数据分别单独进行读取单细胞数据构建Seurat分析对象 读取各种来源的单细胞数据构建Seurat分析对象的教程 做这一步的时候可以查看我这篇写的非常详细的教程文章&#xff1a; 【腾讯文档】单细胞分析步骤1读取各种来源格式…

什么是OFD文件?2025年我推荐新版OFD阅读器和PDF阅读器,双合一

说起文档格式&#xff0c;大家第一反应肯定是PDF&#xff0c;但你知道吗&#xff1f;现在OFD也越来越常见了&#xff0c;特别是在一些正式文件上。刚开始我也是一脸懵&#xff0c;心想这OFD文件咋看啊&#xff1f;网上一搜&#xff0c;发现原来有专门对付它的阅读器&#xff0c…

计算机网络----主要内容简介

这里写目录标题 章节概览每章的大体结构结构功能与服务的关系 一些概念概念一概念二传统的网络层的工作方式&#xff08;路由IP&#xff09;现代的网络层的工作方式&#xff08;SDN&#xff09; 二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二…

每日一练之合并两个有序链表

题目描述&#xff1a; 方法&#xff1a;双指针 代码实例&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> struct ListNode {int val;struct ListNode* next; }; typedef struct ListNode ListNode; struct ListNode* merg…

基于Spring3的抽奖系统

注&#xff1a;项目git仓库地址&#xff1a;demo.lottery 小五Z/Spring items - 码云 - 开源中国 目录 注&#xff1a;项目git仓库地址&#xff1a;demo.lottery 小五Z/Spring items - 码云 - 开源中国 项目具体代码可参考仓库源码&#xff0c;本文只讲解重点代码逻辑 一…

Vue使用jsts,将wkt转为geojson

jsts库相关官方资料&#xff1a; JSTS是一个ECMAScript空间谓词和函数库&#xff0c;用于处理符合开放地理空间联盟发布的SQL简单特征规范的几何图形。JSTS也是成熟的Java库JTS的移植。 npm库的地址&#xff1a;https://www.npmjs.com/package/jsts Github开源项目地址&…

【移动WEB开发】rem适配布局

目录 1. rem基础 2.媒体查询 2.1 语法规范 2.2 媒体查询rem 2.3 引入资源&#xff08;理解&#xff09; 3. less基础 3.1 维护css的弊端 3.2 less介绍 3.3 less变量 3.4 less编译 3.5 less嵌套 3.6 less运算 4. rem适配方案 4.1 rem实际开发 4.2 技术使用 4.3 …