C++多生产者,多消费者模型

C++11实现多生产者,多消费者模型

在C++标准库中实现多生产者多消费者模型,可以使用std::thread、std::queue、互斥锁(std::mutex)、条件变量(std::condition_variable)等组件。下面是一个简单的示例,展示如何创建多生产者和多消费者模型,并使用线程池的概念来限制线程的数量(虽然C++标准库没有直接提供线程池,但可以手动管理线程来模拟)。

main.cpp:

using namespace std;
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>std::queue<int> producedData;
std::mutex mtx;
std::condition_variable cv;void producer(int id, int itemsToProduce) {for (int i = 0; i < itemsToProduce; ++i) {std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟生产时间std::lock_guard<std::mutex> lock(mtx);std::cout << "Producer " << id << " produced " << i << std::endl;producedData.push(i);cv.notify_one(); // 通知消费者有新数据}
}void consumer(int id) {while (true) {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, []{return !producedData.empty();}); // 等待直到队列非空int data = producedData.front();producedData.pop();lock.unlock();std::cout << "Consumer " << id << " consumed " << data << std::endl;if (data == 4) { // 假设每个生产者生产5个数据,消费者在消费完后退出break;}}
}int main()
{constexpr int numProducers = 2;constexpr int numConsumers = 2;constexpr int itemsPerProducer = 5;// 启动生产者线程std::vector<std::thread> producers;for (int i = 0; i < numProducers; ++i) {producers.emplace_back(producer, i, itemsPerProducer);}// 启动消费者线程std::vector<std::thread> consumers;for (int i = 0; i < numConsumers; ++i) {consumers.emplace_back(consumer, i);//在第i个之后追加consumer}// 等待所有生产者线程完成for (auto& t : producers) {t.join();}// 发出结束信号给消费者(在本例中,通过生产的特定数量来隐式完成)// 注意:真实应用中可能需要更明确的结束信号机制// 等待所有消费者线程完成for (auto& t : consumers) {t.join();}return 0;
}

运行效果:
在这里插入图片描述
后续优化:
在实际应用中,可能还需要考虑更多的异常处理逻辑、线程安全、资源管理等问题,以及根据具体需求调整线程的创建和管理策略。

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

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

相关文章

3款录屏录制软件,打造专业级视频内容

随着技术的不断发展&#xff0c;人们在日常工作和学习中经常会遇到记录电脑屏幕的需求&#xff0c;例如录制游戏过程、制作教程、保存会议记录等。为了解决这一需求&#xff0c;许多录屏录制软件应运而生。本文将介绍三款常见的录屏录制软件&#xff0c;通过分析它们的特点和使…

一文带你搞懂DiT(Diffusion Transformer)

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接…

ArcGIS中分割与按属性分割的区别

1、分割ArcGIS批量导出各个市的县级行政边界 视频教学&#xff1a; ArcGIS批量导出各个市的县级行政边界002 2、ArcGIS批量导出全国各省的边界 视频教学&#xff1a; ArcGIS导出全国各省的边界003 推荐学习&#xff1a; ArcGIS全系列实战视频教程——9个单一课程组合系列直播回…

[书生·浦语大模型实战营]——第二节:轻松玩转书生·浦语大模型趣味 Demo

1. 部署InternLM2-Chat-1.8B 模型进行智能对话 1.1配置环境 创建开发机 Intern Studio 官网网址&#xff1a;https://studio.intern-ai.org.cn/ 进入官网后&#xff0c;选择创建开发机&#xff0c;填写 开发机名称 后&#xff0c;点击 选择镜像 使用 Cuda11.7-conda 镜像&am…

CSS中的Flex布局

目录 一.什么是Flex布局 二.Flex布局使用 2.1Flex使用语法 2.2基本概念 三.容器的属性 3.1所有属性概述 3.2flex-direction 3.3flex-wrap 3.4flex-flow 3.5justify-content 3.6align-items 3.7align-content 四.项目(子元素)的属性 4.1所有属性概述 4.2order 4…

遗传算法(Genetic Algorithm, GA)哪些步骤该丢给GPU

遗传算法&#xff08;Genetic Algorithm, GA&#xff09;是一种启发式搜索算法&#xff0c;受到生物进化的启发。在遗传算法中&#xff0c;种群中的每个个体代表问题的一个候选解&#xff0c;通过迭代选择、交叉和变异操作&#xff0c;来模拟自然选择和遗传过程&#xff0c;从而…

九、OpenAI之图片生成(Image generation)

学习用DALL.E的API怎样生成和操作图片 1 介绍 图片API提供3个方法来和图片进行交互&#xff1a; 从0开始基于文字提示创建图片(DALL.E 3 and DALL.E2)基于一个新的提示词&#xff0c;通过让模型替换已有图像的某些区域来创建图像的编辑版本;&#xff08;DALL.E2&#xff09;…

【FPGA】Verilog:解码器 | 编码器 | 多路复用器(Mux, Multiplexer)

0x00 什么是解码器 解码器是根据输入信号在多个输出位中选择一个输出位的装置。例如,当解码器接收2位二进制值作为输入时,它可以接收00、01、10、11四种输入值,并根据每个输入值在4个输出位中选择一个,输出为1000、0100、0010、0001中的一种。这样的解码器被称为高电平有效…

ICML 2024 Mamba 论文总结

2024ICML&#xff08;International Conference on Machine Learning&#xff0c;国际机器学习会议&#xff09;在2024年7月21日-27日在奥地利维也纳举行 &#x1f31f;【紧跟前沿】“时空探索之旅”与你一起探索时空奥秘&#xff01;&#x1f680; 欢迎大家关注时空探索之旅 …

【数据结构与算法 | 基础篇】数组模拟栈

1. 前言 前文我们刚提及了如何用单向链表来模拟栈. 我们还可以用数组来模拟栈.使用栈顶指针top来进行栈顶的操作. 2. 数组模拟栈 (1). 栈接口 public interface stack<E> {//压栈boolean push(E value);//弹栈, 栈非空返回栈顶元素E pop();//返回栈顶元素, 但不弹栈E…

IntelliJ IDEA常用快捷键 + 动图演示!

本文参考了 IntelliJ IDEA 的官网&#xff0c;列举了IntelliJ IDEA &#xff08;Windows 版&#xff09; 的所有快捷键。并在此基础上&#xff0c;为 90% 以上的快捷键提供了动图演示&#xff0c;能够直观的看到操作效果。 该快捷键共分 11 种&#xff0c;可以方便的按各类查找…

【通义千问—Qwen-Agent系列2】案例分析(图像理解图文生成Agent||多模态助手|| 基于ReAct范式的数据分析Agent)

目录 前言一、快速开始1-1、介绍1-2、安装1-3、开发你自己的Agent 二、基于Qwen-Agent的案例分析2-0、环境安装2-1、图像理解&文本生成Agent2-2、 基于ReAct范式的数据分析Agent2-3、 多模态助手 附录1、agent源码2、router源码 总结 前言 Qwen-Agent是一个开发框架。开发…

Excel提取某一列的唯一值

点击【筛选】&#xff08;【高级筛选】&#xff09;&#xff0c;参数里&#xff1a; 列表区域&#xff1a;为需要选择唯一值的那一列复制到&#xff1a;生成唯一值的目标区域 据说新版本的excel有了unique()函数&#xff0c;可以很快捷的选择某一列的唯一值&#xff0c;但是博…

仪器校准中移液器的使用规范,应当注意哪些细节?

校准行业中&#xff0c;移液器的使用是非常多的&#xff0c;尤其是理化室&#xff0c;经常需要借助到移液器来校准。作为常规的溶液定量转移器具&#xff0c;其在校准过程中的使用也需要遵守规范&#xff0c;既是保证校准结果准确低误差&#xff0c;也是为了规范实验室校准人员…

类与对象:接口

一.概念 接口&#xff08;英文&#xff1a;Interface&#xff09;&#xff0c;在JAVA编程语言中是一个抽象类型&#xff0c;是抽象方法的集合&#xff0c;接口通常以interface来声明。 二.语法规则 与定义类相似&#xff0c;使用interface关键词。 Idea可以在开始时直接创建…

高德地图PlaceSearch标记点清除

在开发过程中发现引入 AMap.PlaceSearch 插件之后 增加map属性之后&#xff0c;地图上会出现自带的marker点&#xff0c; 这时通过 searchNearBy()成员方法获取到的地点值含有省市区等详细信息 但是将map属性注释掉之后 发现不返回省市区&#xff0c;但是又不想关联上展示mar…

动静态库

说明&#xff1a;使用动静态库&#xff0c;一般直接安装即可&#xff0c;其他使用方法了解即可 静态库 静态库&#xff08;Static Library&#xff09;是一种将代码和数据打包成一个单独的文件的库文件&#xff0c;主要用于编译时的链接&#xff0c;而不是运行时。静态库通常…

Android Studio 所有历史版本下载

一、官网链接 https://developer.android.google.cn/studio/archive 操作 二、AndroidDevTools地址 https://www.androiddevtools.cn/ 参考 https://blog.csdn.net/qq_27623455/article/details/103008937

Mybatis源码剖析---第二讲

Mybatis源码剖析—第二讲 那我们在讲完了mappedstatement这个类&#xff0c;它的一个核心作用之后呢&#xff1f;那下面我有一个问题想问问各位。作为mappedstatement来讲&#xff0c;它封装的是一个select标签或者insert标签。但是呢&#xff0c;我们需要大家注意的是什么&am…