当前位置: 首页 > news >正文

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;    
}

相关文章:

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

运行在VS2022&#xff0c;x86&#xff0c;Debug下。 32. 生产者消费者模式 解耦生产者和消费者之间的关系&#xff0c;即生产者和消费者只依赖缓冲区&#xff0c;而不相互依赖。应用&#xff1a;多线程并发编程&#xff0c;可以解决生产者和消费者之间的同步问题。实现 生产者…...

VSTO Word.net 如何在另外的工程内添加CustomTaskPane

其他工程肯定是不能直接添加CustomTaskPane面板的&#xff0c;但我们可以在ThisAddIn 中先把对应的panel给新建出来再进行隐藏。步骤如下&#xff1a; 1.在另外工程中定义public static CustomTaskPane currMainForm;把需要隐藏的界面赋值给currMainForm&#xff1b; 2.在另外…...

ROS——自定义话题消息和使用方法

定义Person话题 定义Person发布者 /*** 该例程将发布/person_info话题&#xff0c;自定义消息类型&#xff1a; test_topic::Person*/#include <ros/ros.h> #include <test_topic/Person.h> //包含的头文件&#xff0c;ros相关的头文件&#xff0c;及自定义头文件…...

包装对象类型又是啥啊。。。

包装对象类型 目录 包装对象类型 目录包装对象的概念包装对象类型和字面量类型Objectobject 包装对象的概念 JavaScript 的8种类型之中&#xff0c;undefined和null其实是两个特殊值&#xff0c;object属于复合类型&#xff0c;剩下的五种属于原始类型&#xff08;primiti…...

服务编排如何选?这几款可视化服务编排引擎,开发团队赶紧收藏

最近看到几款不错的服务编排的产品&#xff0c;先给大家上图看看 扣子&#xff1a; jvs-logic&#xff1a; node-red&#xff1a; jvs-rules&#xff1a; 上述几个产品是最近看到的 几个比较有特点的服务编排的系统。 接下来我对API详细分解下&#xff0c;说明下优点与挑战 服…...

web前端语言框架:探索现代前端开发的核心架构

web前端语言框架&#xff1a;探索现代前端开发的核心架构 在快速发展的web开发领域&#xff0c;前端语言框架的选择对于项目的成功至关重要。它们不仅影响着开发效率&#xff0c;更直接关系到用户体验与网站性能。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;…...

基于flask的网站如何使用https加密通信

文章目录 内容简介网站目录示例生成SSL证书单独使用Flask使用WSGI服务器Nginx反向代理参考资料 内容简介 HTTPS 是一种至关重要的网络安全协议&#xff0c;它通过在 HTTP 协议之上添加 SSL/TLS 层来确保数据传输的安全性和完整性。这有助于防止数据在客户端和服务器之间传输时…...

软件测试面试题(应届生)

设计员工管理系统的测试用例时&#xff0c;需要考虑系统的各种功能和可能的使用场景&#xff0c;以确保系统的稳定性和准确性。以下是一些设计测试用例的基本步骤和策略&#xff1a; 一、明确测试目标 首先&#xff0c;需要明确测试的目标&#xff0c;例如确保员工信息的准确…...

使用halo的jar方法搭建博客(数据库mysql

ssh连接远程主机 ➜ ~ ssh root 146.56.249.61 第一步.在CentOS 7上安装下载OpenJDK 17的tar.gz文件 wget https://download.java.net/java/GA/jdk17.0.1/2a2082e5a09d4267845be086888add4f/12/GPL/openjdk-17.0.1_linux-x64_bin.tar.gz解压 tar xvf openjdk-17.0.1_linux-…...

Linux - 复盘一次句柄数引发的故障

文章目录 Pre&#xff08;内核、用户、进程&#xff09;句柄数设置问题 shell修复 Pre Linux - 深入理解/proc虚拟文件系统&#xff1a;从基础到高级 &#xff08;内核、用户、进程&#xff09;句柄数设置 在Linux系统中&#xff0c;进程打开的最大句柄数可以通过多种方式配置…...

2024/06/13--代码随想录算法2/17| 62.不同路径、63. 不同路径 II、343. 整数拆分 (可跳过)、96.不同的二叉搜索树 (可跳过)

62.不同路径 力扣链接 动态规划5步曲 确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a; dp[i][j] &#xff1a;表示从&#xff08;0 &#xff0c;0&#xff09;出发&#xff0c;到(i, j) 有dp[i][j]条不同的路径。确定递推公式&#xff0c;dp[i][j] d…...

Android低代码开发 - 直接创建一个下拉刷新列表界面

看了我Android低代码开发 - 让IDE帮你写代码这篇文章的小伙伴&#xff0c;大概都对Dora全家桶开发框架有基本的认识了吧。本篇文章将会讲解如何使用dora-studio-plugin快捷创建一个下拉刷新列表界面。 效果演示 这样直接通过图形界面的方式就创建好了下拉刷新上拉加载空态界面…...

23.Dropout

在深度学习的训练过程中&#xff0c;过拟合是一个常见的问题。为了解决这个问题&#xff0c;研究者们提出了多种正则化技术&#xff0c;其中Dropout技术因其简单而有效的特点&#xff0c;得到了广泛的应用。本文将对Dropout技术的工作原理、主要优点、潜在缺点以及应用场景进行…...

电脑撤回的快捷键是什么?

下面给大家介绍了各种办公应用的撤回以及反向撤回快捷键介绍&#xff0c;在ps、excel中都是可以使用的。 撤回键是ctrl加什么 1、撤销的快捷键是“CtrlZ”&#xff0c;用于取消上一步操作&#xff0c;对与在电脑系统上或软件内的操作均适用。重复按下可以取消多步操作。 2、而…...

每日一题——Python实现PAT甲级1116 Come on! Let‘s C(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码点评 时间复杂度分析 空间复杂度分析 总结 我要更强 优化思路 优化…...

spring-data-mongodb版本兼容问题

spring-data-mongodb与mongodb驱动有兼容性问题&#xff0c;不匹配会报NoSuchMethod异常&#xff0c;mongodb的java驱动包在4.0之后由mongodb-java-driver更名为mongodb-driver-sync。 spring-data-mongodb包依赖中有mongodb-driver-core&#xff0c;但缺诸如MongoCollection等…...

Java的核心类库

引言 在Java编程中&#xff0c;熟练掌握常用类与对象操作是开发的基础。Java的核心类库提供了丰富的功能&#xff0c;可以帮助开发者高效地处理各种编程任务。本文将详细介绍Java字符串操作、集合框架、日期与时间处理等内容&#xff0c;并通过图表和表格进行总结与示范。 字符…...

NSS题目练习9

[极客大挑战 2020]welcome 界面打开后一片空白&#xff0c;查看题目描述&#xff0c;翻译过来是 1.除了GET请求方法&#xff0c;还有一种常见的请求方法… 2.学习一些关于sha1和array的知识。 3.更仔细地检查phpinfo&#xff0c;你会发现标志在哪里。 补充&#xff1a; sh…...

JS 【算法】二分查找

使用场景 在有序数组中查找目标元素 const arr [1, 2, 3, 4, 5, 6, 7, 8, 9] const target 2 console.log(binarySearch1(arr, target)) console.log(binarySearch2(arr, target))循环实现 function binarySearch1(arr, target) {const length arr.lengthif (length 0) re…...

前端工程化工具系列(十四)—— Webpack(v5.91.0):应用模块打包器与构建工具

Webpack 是用于现代 JavaScript 应用程序的静态模块打包器。 当 webpack 处理应用程序时&#xff0c;它会在内部构建一个依赖关系图&#xff0c;该图映射项目所需的每个模块最终会生成一个或多个包。 1 概念 1.1 modules Webpack 中&#xff0c;无论是 JS 、CSS 还是图片等&…...

SU-03T模块烧录固件保姆级教程:从‘智能公元’配置到串口下载(避坑‘路径中文’和‘重新上电’)

SU-03T固件烧录实战指南&#xff1a;从智能公元配置到串口下载全流程解析 第一次拿到SU-03T语音模块时&#xff0c;那种既兴奋又忐忑的心情我至今记忆犹新。作为一款高性能离线语音识别模块&#xff0c;SU-03T确实能带来无限可能&#xff0c;但固件烧录这个看似简单的步骤却让不…...

贪心-摆动序列、不重叠字串数量

Ref 贪心B站搜索-折半搜索 分发饼干 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(),g.end());sort(s.begin(),s.end());int cnt0;for(int i0,j0;i<g.size()&&j<s.size();){if(s[j]&…...

阿里图标库(Iconfont)的本地引入 详细步骤

阿里图标库&#xff08;Iconfont&#xff09;本地引入 Vue3 详细步骤&#xff08;文字版&#xff09; 一、准备工作 登录 Iconfont 官网 访问 Iconfont 官网&#xff0c;使用账号登录&#xff08;若无账号需注册&#xff09;。 选择图标并加入项目 在搜索框输入关键词&#x…...

零基础入门:5分钟学会用Ollama运行Granite-4.0-H-350M文本生成

零基础入门&#xff1a;5分钟学会用Ollama运行Granite-4.0-H-350M文本生成 1. 为什么选择Granite-4.0-H-350M Granite-4.0-H-350M是一个轻量级但功能强大的文本生成模型&#xff0c;特别适合初学者和资源有限的用户。它只有3.5亿参数&#xff0c;却能在普通电脑上流畅运行&am…...

提升开放平台开发效率,快马AI工具链自动化集成与测试

在企业级开放平台的开发过程中&#xff0c;效率往往是决定项目成败的关键因素之一。传统的开发流程中&#xff0c;开发者需要花费大量时间在重复性工作上&#xff0c;比如编写API客户端代码、配置测试环境、维护文档等。这些工作不仅耗时&#xff0c;还容易出错。今天我想分享一…...

量子行走:从理论到Python实现——量子力学原理与Qubit物理

目录 2. 量子力学原理与Qubit物理 2.1 量子比特的物理实现 2.1.1 双能级系统建模 2.1.2 布洛赫球表示与可视化 2.2 叠加与纠缠现象 2.2.1 量子叠加原理 2.2.2 量子纠缠理论 2.3 量子测量与退相干 2.3.1 测量公设的实现 2.3.2 噪声与退相干机制 2. 量子力学原理与Qubi…...

pykg2vec功能mastery:知识图谱嵌入模型的高级配置与优化

pykg2vec功能mastery&#xff1a;知识图谱嵌入模型的高级配置与优化 【免费下载链接】pykg2vec 项目地址: https://gitcode.com/gh_mirrors/py/pykg2vec 问题导入 知识图谱嵌入模型训练中&#xff0c;开发者常面临三大痛点&#xff1a;模型参数调优耗时且效果不佳、不…...

全格式文档智能处理:AnythingLLM的多模态知识管理解决方案

全格式文档智能处理&#xff1a;AnythingLLM的多模态知识管理解决方案 【免费下载链接】anything-llm 这是一个全栈应用程序&#xff0c;可以将任何文档、资源&#xff08;如网址链接、音频、视频&#xff09;或内容片段转换为上下文&#xff0c;以便任何大语言模型&#xff08…...

效率提升:基于快马平台快速集成openclaw开发局域网协作工具

最近在团队协作开发中遇到了一个痛点&#xff1a;每次新成员加入局域网时&#xff0c;都需要手动配置设备信息才能互相访问&#xff0c;文件共享和实时沟通也依赖第三方工具&#xff0c;效率很低。于是尝试用openclaw结合InsCode(快马)平台快速搭建了一套本地化协作工具&#x…...

蓄电池与超级电容混合储能微电网的未讲解部分总结

蓄电池 超级电容混合储能微电网 没有讲解搞离网微电网的都懂&#xff0c;储能这块一直是卡脖子的事儿——单独堆蓄电池吧&#xff0c;遇到村里突然开个打米机、抽水泵这种大负载&#xff0c;瞬间电流顶上去&#xff0c;电瓶寿命唰唰掉&#xff1b;全上超级电容呢&#xff0c;确…...