C++实现一个简单的生产者-消费者队列
时间:2023-04-27
本文章向大家介绍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();
}
原文地址:https://www.cnblogs.com/timefiles/p/17360496.html
- 深度学习界的 “吃鸡挂”——目标检测 SSD 实验
- Hadoop查看所有JOB以及如何Kill指定用户的所有Job
- Java基础-23(01)总结多线程,线程实现Runnable接口,线程名字获取和设置,线程控制,线程安全,同步线程
- ORA-01427问题的分析和解决(r6笔记第51天)
- 从编程实现角度学习 Faster R-CNN(附极简实现)
- Java基础-23(02)总结多线程,线程实现Runnable接口,线程名字获取和设置,线程控制,线程安全,同步线程
- 8 个最好的 Java RESTful 框架
- 【C++基础】C++11 lambda 表达式解析
- 大量redo生成的问题原因及改进(r6笔记第50天)
- Java基础-22总结登录注册IO版,数据操作流,内存操作流,打印流,标准输入输出流,
- YOLO,一种简易快捷的目标检测算法
- Java基础-22总结转换流,随机访问流,合并流,序列化流,Properties
- openshift镜像构建
- 关于数据库无法登录的问题反思(r6笔记第49天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PaGoDo:一款功能强大的被动式Google Dork
- 微软轻量级系统监控工具sysmon原理与实现完全分析
- 用Windows电脑训练深度学习模型?超详细配置教程来了
- rConfig中的远程代码执行漏洞分析
- CVE-2020-9964:iOS中的信息泄露漏洞分析
- ReconSpider:一款功能强大的高级OSINT框架
- Python 3.9来了!这十个新特性值得关注
- IRFuzz:一款基于YARA规则的文档文件扫描工具
- 内网渗透测试研究:从NTDS.dit获取域散列值
- 腾讯云大禹高防IP之客户端获取真实IP
- 终极解密输入网址按回车到底发生了什么
- Kafka核心原理的秘密,藏在这 17 张图中
- 国庆肝了8天整整2W字的数据库知识点
- MySQL事务与MVCC如何实现的隔离级别
- 1.5w字,30图带你彻底掌握 AQS!