C++设计模式-生产者消费者模式

运行在VS2022,x86,Debug下。

32. 生产者消费者模式

  • 解耦生产者和消费者之间的关系,即生产者和消费者只依赖缓冲区,而不相互依赖。
  • 应用:多线程并发编程,可以解决生产者和消费者之间的同步问题。
  • 实现
    • 生产者:负责产生数据的模块。
    • 消费者:负责处理数据的模块。
    • 中介:缓冲区。
  • 代码如下。
    lambda表达式在condition_variable::wait()中充当断言。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <vector>
using namespace std;const int BUFFER_SIZE = 10;  //缓冲区大小queue<int> buffer;           //缓冲区, 用于存放数据
mutex mtx;                   //互斥量,用于保护共享资源
condition_variable prod_cv; // 生产者条件变量,用于线程间的同步
condition_variable cons_cv; // 消费者条件变量//生产者
void producer()
{for (int i = 0; i < 20; i++)   //循环生产20个数据{ unique_lock<mutex> lock(mtx);    //独占锁,确保同一时刻只有一个线程访问临界区prod_cv.wait(lock, [] { return buffer.size() < BUFFER_SIZE; });    //等待条件满足,即缓冲区不满buffer.push(i); cout << "Producer ID:" << this_thread::get_id() << " Produced: " << i << std::endl;lock.unlock();            //解锁互斥量cons_cv.notify_all();     //通知消费者this_thread::sleep_for(std::chrono::milliseconds(500)); //睡眠, 模拟生产过程}
}//消费者
void consumer() 
{for (int i = 0; i < 20; i++)   //循环消费20个数据{unique_lock<std::mutex> lock(mtx);cons_cv.wait(lock, [] { return !buffer.empty(); });  //等待条件满足,即缓冲区不为空cout << "Consumer ID:" << this_thread::get_id() << " Consumed: " << buffer.front() << endl;buffer.pop();lock.unlock();prod_cv.notify_all();  //通知生产者this_thread::sleep_for(std::chrono::milliseconds(800));}
}int main()
{const int num_producers = 2;  //生产者数量const int num_consumers = 2;  //消费者数量vector<thread> producer_threads;vector<thread> consumer_threads;for (int i = 0; i < num_producers; i++)   //创建生产者线程producer_threads.emplace_back(producer);for (int i = 0; i < num_consumers; i++)  //创建消费者线程consumer_threads.emplace_back(consumer);for (auto&& thread : producer_threads)  //等待所有生产者线程结束thread.join();for (auto&& thread : consumer_threads)  //等待所有消费者线程结束thread.join();return 0;    
}

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

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

相关文章

Dubbo 3.x源码(21)—Dubbo服务引用源码(4)

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了createInvokerForRemote方法中的Wrapper有哪些以及作用&#xff0c;接下来我们将会的学习真正的本地、应用级别、接口级别的Protocol的引入逻辑&#xff0c;以及创建Proxy服务接口代理对象的逻…

分享不用会员免费听歌的软件,可听付费,支持随听随下!

今天来点特别的&#xff0c;给你们带来几款全网免费听歌的神器&#xff0c;让你们的音乐之旅不再有障碍&#xff01; 现在&#xff0c;找好听的歌越来越像寻宝一样&#xff0c;动不动就得掏腰包。不过别担心&#xff0c;阿星今天就来分享几款好用的免费听歌app&#xff0c;电脑…

六、【源码】SQL执行器的定义和实现

源码地址&#xff1a;https://github.com/mybatis/mybatis-3/ 仓库地址&#xff1a;https://gitcode.net/qq_42665745/mybatis/-/tree/06-sql-executor SQL执行器的定义和实现 之前的Sql执行都是耦合在SqlSession里的&#xff0c;现在要对这部分进行解耦和重构&#xff0c;引…

【MySQL】(基础篇四) —— 检索数据

检索数据 检索数据是我们使用数据库时进行最多的操作&#xff0c;其中包括了检索条件、排序、过滤、分组等等。我会在后续的多篇博客中为你进行详细地介绍它们。 这次先让我们来粗略的了解一下SELECT&#xff0c;为了使用SELECT检索表数据&#xff0c;必须至少明确两点信息—…

【JsDoc】JsDoc用法 | 巧妙用法

type type {other} other 接收表达式或字符 1、数组代码提示 1、效果图 1、码 /*** type {Array.<play|paush|next>} */ let music []2、字符串提示 2、效果图 2、码 /*** type {a|b|c}*/ let str

大模型PEFT(二) 之 大模型LoRA指令微调实践

环境搭建 git clone -b v0.6.1 --depth1 https://github.com/hiyouga/LLaMA-Factory.gitcd LLaMA-Factoryconda create -n py310 python3.10 source activate py310pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --ignore-installed疑问 !git…

项目-五子棋双人对战:游戏房间的管理(5)

完整代码见: 邹锦辉个人所有代码: 测试仓库 - Gitee.com 之前我们已经实现了玩家匹配的功能, 我们都知道, 匹配完过后就可以进入游戏房间进行对战了, 所以我们下一步关注的重点就是对于游戏房间的管理. 模块详细讲解 功能需求 通过匹配的方式, 自动给玩家加入到一个游戏房间…

atomic特质的局限性

为什么在实际的 Objective-C 开发中, 几乎所有的属性都声明为 nonatomic ? 声明为 atomic 的属性我是真的没见过 在实际的 Objective-C 开发中&#xff0c;大多数属性通常声明为 nonatomic&#xff0c;主要原因包括性能考虑和常见的设计模式。具体原因如下&#xff1a; 性能问…

java-集合使用 3

TreeSet 类 TreeSet 类是基于红黑树的数据结构实现的&#xff0c;主要特点如下&#xff1a; - 不允许包含重复元素&#xff1b; - 允许使用 null 值&#xff1b; - 线程不安全&#xff1b; - 插入和删除速度较慢&#xff0c;但查询速度快&#xff0c;可以对元素进行排序。 示例…

JAVA java8中内置的四大核心接口

Consumer:消费型接口 方法&#xff1a;void accept(T t) private static void test01(){happy(50000,(money)-> System.out.println("zrx将来月薪"money"元"));}public static void happy(double money, Consumer<Double> com){com.accept(money…

20240606更新Toybrick的TB-RK3588开发板在Android12下的内核

20240606更新Toybrick的TB-RK3588开发板在Android12下的内核 2024/6/6 10:51 0、整体编译&#xff1a; 1、cat android12-rk-outside.tar.gz* | tar -xzv 2、cd android12 3、. build/envsetup.sh 4、lunch rk3588_s-userdebug 5、./build.sh -AUCKu -d rk3588-toybrick-x0-a…

Clo3D导出服装动画,使用Unity3D展示

1.前言 Clo3D是一款应用于时装行业的3D服装设计软件,其强大的布料模拟算法可在3D空间中实现设计、制版、试衣和走秀,大幅提升数字作品逼真度和制作效率。为了让服装动画效果展示在Unity3D上模拟效果&#xff0c;需要Clo3D模拟出逼着的衣服动画。总体流程为Clo3D - Mixamo -Blen…

登Cell Press子刊,武汉理工大学团队基于集成学习提出简化电化学模型,0.17s完成3500s的1C恒流放电

2022 年 7 月&#xff0c;不老男神林志颖突发车祸&#xff0c;作为专业赛车手的他驾驶的特斯拉 Model X 在行驶过程中忽然偏离既定轨迹&#xff0c;一头撞向路边的隔离带&#xff0c;随后车辆起火&#xff0c;并在救援车拖吊过程中二次起火&#xff0c;最终整辆车被烧到只剩下了…

【ai】Audio2Face

Audio2Face 简介 Audio2Face是英伟达Omniverse平台的一部分,它使用先进的AI技术来生成基于音频输入的逼真面部动画。这个技术主要利用深度学习模型来解析人声,进而驱动一个三维模型的面部表情。下面是Audio2Face工作流程的详细说明: 预备阶段 在使用Audio2Face之前,需要准…

从零手写实现 nginx-13-nginx.conf 配置例子解释 + nginx 配置文件要如何解析?

前言 大家好&#xff0c;我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的&#xff0c;可以参考我的另一个项目&#xff1a; 手写从零实现简易版 tomcat minicat 手写 nginx 系列 …

Java心跳检测机制

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 心跳检测的定义 心跳检测是一种监控机制&#xff0c;在Java编程和分布式系统中具有广泛的应用。心跳检测&#xff0c;顾名思义&#xff0c;就像心跳一样&#xff0c;是一种…

【JS】理解闭包及其应用

历史小剧场 明朝灭亡&#xff0c;并非是简单的政治问题&#xff0c;事实上&#xff0c;这是世界经济史上的一个重要案例。 所谓没钱&#xff0c;就是没有白银。----《明朝那些事儿》 什么是闭包&#xff1f; 闭包就是指有权访问另一个函数作用域中变量的函数 闭包变量存储位置&…

Lidar3607.2 雷达点云数据处理软件新增功能介绍

新特性:预处理航带平差新增livox激光器镜面误差改正,新增多源航带平差&#xff0c;提升点云和影像匹配精度优化配准功能流程&#xff0c;ICP功能支持点云与模型配准安置检校新增轨迹自动裁剪轨迹解算时投影坐标增加Z值记录数据管理新增点云色彩亮度和对比度调节新增多段线平滑工…

Python中报错提示:TypeError: Student() takes no arguments

Python中报错提示&#xff1a;TypeError: Student() takes no arguments 在Python编程中&#xff0c;类是创建对象的蓝图。每个类都可能包含一个特殊的方法__init__&#xff0c;我们称之为构造函数&#xff0c;它在创建新实例时被调用。如果你在尝试创建一个类的实例时遇到了Ty…

端午节赛龙舟,我们的新队员---AI大模型

赛龙舟的比赛通常在一个湖泊或河流上进行&#xff0c;参赛队伍会驾驭着长形的龙舟&#xff0c;每艘船上有一名鼓手和多名桨手。比赛开始时&#xff0c;鼓手会击鼓来指挥桨手的划桨节奏&#xff0c;而桨手们则要协同合作&#xff0c;以最快的速度将龙舟划向终点。 赛龙舟不仅仅是…