C++实现一个简单的生产者-消费者队列
本文的代码都是ChatGPT生成,我只是做了微小的调整和整合,AI提示词如下:
设计一个C++类,支持生产者-消费者模型,可以通过size函数获取剩余数量
可能第一次生成的不一定合适,多刷新几次。
生成的ProducerConsumerQueue.h代码如下:
#ifndef PRODUCER_CONSUMER_QUEUE_H
#define PRODUCER_CONSUMER_QUEUE_H
#include <queue>
#include <mutex>
#include <condition_variable>
template<typename T>
class ProducerConsumerQueue {
public:
ProducerConsumerQueue(int size) : m_maxSize(size), m_curSize(0) {}
void push(T& val) {
std::unique_lock<std::mutex> lock(m_mutex);
while (m_curSize >= m_maxSize) {
m_notFull.wait(lock);
}
m_queue.push(val);
++m_curSize;
m_notEmpty.notify_one();
}
T pop() {
std::unique_lock<std::mutex> lock(m_mutex);
while (m_curSize <= 0) {
m_notEmpty.wait(lock);
}
T val = m_queue.front();
m_queue.pop();
--m_curSize;
m_notFull.notify_one();
return val;
}
int size() {
std::unique_lock<std::mutex> lock(m_mutex);
return m_curSize;
}
private:
std::queue<T> m_queue;
int m_maxSize;
int m_curSize;
std::mutex m_mutex;
std::condition_variable m_notEmpty;
std::condition_variable m_notFull;
};
#endif //PRODUCER_CONSUMER_QUEUE_H
在上面的代码中,我们定义了一个ProducerConsumerQueue类:
- ProducerConsumerQueue类有最大容量和当前容量两个属性,使用std::queue<int>存储数据,使用std::mutex保证线程安全,使用std::condition_variable实现线程同步。
- 在push函数中,如果当前容量已满,等待消费者消费;否则插入数据,当前容量加1,通知消费者。
- 在pop函数中,如果当前容量为0,等待生产者生产;否则取出数据,当前容量减1,通知生产者。
- 在size函数中,使用std::unique_lockstd::mutex保证线程安全,获取当前容量并返回。
测试示例代码如下:
#include <iostream>
#include "ProducerConsumerQueue.h"
int main() {
ProducerConsumerQueue<int> queue(2);
// 生产者线程
std::thread producer([&queue] {
for (int i = 0; i < 10; ++i) {
queue.push(i);
}
});
// 消费者线程
std::thread consumer([&queue] {
for (int i = 0; i < 10; ++i) {
int value = queue.pop();
std::cout << "Consumed " << value << std::endl;
std::cout << queue.size() << std::endl;
}
});
producer.join();
consumer.join();
}
C++实现一个简单的生产者-消费者队列的更多相关文章
- 使用队列queue实现一个简单的生产者消费者模型
一.生产者消费者模型 我们去超市商店等地购买商品时,我们大部分人都会说自己是消费者,而超市的各大供货商.工厂等,自然而然地也就成了我们的生产者.如此一来,生产者有了,消费者也有了,那么将二者联系起来的 ...
- Linux 进程间通信(包含一个经典的生产者消费者实例代码)
前言:编写多进程程序时,有时不可避免的需要在多个进程之间传递数据,我们知道,进程的用户的地址空间是独立,父进程中对数据的修改并不会反映到子进程中,但内核是共享的,大多数进程间通信方式都是在内核中建立一 ...
- C# 实现生产者消费者队列
开发过程中经常会碰到这样的场景:需要从一个地方获取一些数据,然后处理数据并将其保存在数据库中. 1 2 3 4 5 6 7 8 9 10 private void FetchData() {} pri ...
- C# 实现生产者消费者队列 (转)
按语:按照下面文档,测试成功: https://www.cnblogs.com/samgk/p/4772806.html 开发过程中经常会碰到这样的场景:需要从一个地方获取一些数据,然后处理数据并将其 ...
- 手把手教你用redis实现一个简单的mq消息队列(java)
众所周知,消息队列是应用系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有 ActiveMQ,RabbitMQ,Zero ...
- Python-生成器实现简单的"生产者消费者"模型
一.使用生成器实现简单的生产者消费者模型, 1.效果截屏 代码如下: import time def consumer(name): print('%s 开始买手机' %name) while Tru ...
- 用Java写一个生产者-消费者队列
生产者消费者的模型作用 通过平衡生产者的生产能力和消费者的消费能力来提升整个系统的运行效率,这是生产者消费者模型最重要的作用. 解耦,这是生产者消费者模型附带的作用,解耦意味着生产者和消费者之间的联系 ...
- java使用lock实现一个简单的生产者和消费者模式
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public ...
- java简单模拟生产者消费者问题
本文来自:http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html 引言 生产者和消费者问题是线程模型中的经典问题:生产者和 ...
- 转(C# 实现生产者消费者队列)
class Program { // 任务队列 static Queue<string> _tasks = new Queue<string>(); // 为保证线程安全,使用 ...
随机推荐
- 3.1 Windows驱动开发:内核远程堆分配与销毁
在开始学习内核内存读写篇之前,我们先来实现一个简单的内存分配销毁堆的功能,在内核空间内用户依然可以动态的申请与销毁一段可控的堆空间,一般而言内核中提供了ZwAllocateVirtualMemory这 ...
- 15.1 套接字通过域名取IP地址
首先我们来实现一个DNS查询功能,该功能的目的是传入一个网站域名自动将该域名解析为对应的IP地址,该功能的实现依赖于gethostbyname函数,该函数将主机名作为参数,并返回一个指向hostent ...
- 给Java小白,整理一套能上手的简单编程算法题!!!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 数学离程序员有多近? ifelse也好.for循环也罢,代码可以说就是对数学逻辑的具 ...
- 17.2 内存映射文件的一致性--《Windows核心编程》
系统允许我们把同一个文件映射到多个视图中,只要映射的是同一个文件映射对象,系统会保证各视图中数据是一致的.例如一个程序修改了一个视图内的内容,那么系统会更新所有其他视图(对应同一文件映射对象)中的内容 ...
- 程序语言多态(overide) - delphi 版本
程序语言多态 - delphi 版本 前言: 所有程序语言都差不多,特写一篇 delphi 版本 的多态:其它语言 类同. 都是一些别人规定的语法而已,别人用一个下午设计一门语言,愚弄天下程序员一生: ...
- .NET 大数据实时计算--学习笔记
摘要 纯 .Net 自研大数据实时计算平台,在中通快递服务数百亿包裹,处理数据万亿计!将分享大数据如何落地以及设计思路,技术重难点. 目录 背景介绍 计算平台架构 项目实战 背景介绍 计算平台架构 分 ...
- Hive实战
1.使用hive实现WordCount (1) 创建数据库 create database wordcount; (2) 创建外部表 create external table word_data(l ...
- Pandas分析泰坦尼克号生还比例
提出问题 影响乘客生还的因素很多,这里只对乘客的性别.年龄.乘客等级.这三个因素感兴趣, 看看这四个因素是否会影响乘客的生还率. 1.性别是否会影响生还率 2.年龄是否会影响生还率 3.乘客等级会否会 ...
- U盘安装win7提示缺少所需的CD/DVD驱动器设备驱动程序
问题: 最近使用U盘启动盘安装win7,系统弹出提示框: 解决方法: U盘别插在usb3.0的口(蓝色),换成一个usb2.0的口就可以了
- 如何设置 vcpkg 依赖特定编译器
最近项目要部署到 gitlab-ci 上,所以远程机器上也要安装好编译环境 在相关的环境安装完后,发现编译项目时提示找不到三方库的符号文件 看到这个错误的第一反应就是依赖库的版本不对,因为远程机器上不 ...