广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++实现简单的生产者-消费者队列详解
  • 304
分享到

C++实现简单的生产者-消费者队列详解

C++实现生产者消费者队列C++生产者消费者队列C++队列 2023-05-18 05:05:03 304人浏览 八月长安
摘要

本文的代码都是ChatGPT生成,我只是做了微小的调整和整合,ai提示词如下: 设计一个c++类,支持生产者-消费者模型,可以通过size函数获取剩余数量 可能第一次生成的不一定合适

本文的代码都是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++实现简单的生产者-消费者队列详解的文章就介绍到这了,更多相关C++生产者消费者队列内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++实现简单的生产者-消费者队列详解

本文链接: https://www.lsjlt.com/news/211727.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++实现简单的生产者-消费者队列详解
    本文的代码都是ChatGPT生成,我只是做了微小的调整和整合,AI提示词如下: 设计一个C++类,支持生产者-消费者模型,可以通过size函数获取剩余数量 可能第一次生成的不一定合适...
    99+
    2023-05-18
    C++实现生产者消费者队列 C++生产者消费者队列 C++队列
  • Go语言实现一个简单生产者消费者模型
    目录一、生产者消费者模型二、Go语言实现1、无缓冲channel2、有缓冲channel三、实际应用简介:介绍生产者消费者模型,及go简单实现的demo。 一、生产者消费者模型...
    99+
    2022-06-07
    GO 模型 go语言
  • Java 生产者/消费者问题实例详解
    生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况:存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去...
    99+
    2023-05-31
    java 生产者消费者 ava
  • java wait()/notify() 实现生产者消费者模式详解
    java wait()/notify() 实现生产者消费者模式 java中的多线程会涉及到线程间通信,常见的线程通信方式,例如共享变量、管道流等,这里我们要实现生产者消费者模式,也需...
    99+
    2022-11-12
  • 队列的生产者与消费者模式在PHP与MySQL中的实现方法
    随着互联网业务的快速发展,系统中处理大量任务的需求变得越来越迫切。队列是一种常见的解决方案,可以高效地处理任务。队列的生产者-消费者模式(Producer-Consumer Pattern)在PHP和MySQL中的实现方法是一种常见的解决方...
    99+
    2023-10-21
    MySQL 消费者 PHP 队列 生产者
  • Go语言如何实现一个简单生产者消费者模型
    这篇文章给大家分享的是有关Go语言如何实现一个简单生产者消费者模型的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、生产者消费者模型生产者消费者模型:某个模块(函数等〉负责产生数据,这些数据由另一个模块来负责处理...
    99+
    2023-06-22
  • PHP实现生产者与消费者的案例
    这篇文章主要介绍PHP实现生产者与消费者的案例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!PHP中使用Kafka需要RdKafka扩展,而RdKafka依赖于librdkafka,所以这两个我们都需要安装,具体安装...
    99+
    2023-06-14
  • Queue 实现生产者消费者模型(实例讲解)
    Python中,队列是线程间最常用的交换数据的形式。 Python Queue模块有三种队列及构造函数: 1、Python Queue模块的FIFO队列先进先出。 class Queue.Queue(max...
    99+
    2022-06-04
    生产者 实例 模型
  • Docker启动RabbitMQ实现生产者与消费者的详细过程
    目录一、Docker拉取镜像并启动RabbitMQ二、Hello World(一)依赖导入(二)消息生产者(三)消息消费者三、实现轮训分发消息(一)抽取工具类(二)启动两个工作线程(...
    99+
    2023-02-23
    Docker启动RabbitMQ Docker 生产者与消费者
  • Java编程生产者消费者实现的四种方法
    目录实现生产者消费者的四种方式一、最基础的二、java.util.concurrent.lock 中的 Lock 框架三、阻塞队列BlockingQueue的实现Blockqueue...
    99+
    2022-11-12
  • SpringBoot整合RabbitMQ, 实现生产者与消费者的功能
    自然,依赖是少不了的。除了spring-boot-starter-web依赖外。 就这个是最主要的依赖了,其他的看着办就是了。我用的是gradle,用maven的看着弄也一样的。无非...
    99+
    2022-11-11
  • Java实现生产者消费者问题与读者写者问题的示例分析
    这篇文章将为大家详细讲解有关Java实现生产者消费者问题与读者写者问题的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、生产者消费者问题生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它...
    99+
    2023-05-30
    java
  • SpringBoot整合RabbitMQ,怎么实现生产者与消费者的功能
    这篇文章主要介绍“SpringBoot整合RabbitMQ,怎么实现生产者与消费者的功能”,在日常操作中,相信很多人在SpringBoot整合RabbitMQ,怎么实现生产者与消费者的功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的...
    99+
    2023-06-14
  • C#使用泛型队列Queue实现生产消费模式
    如果把生产消费想像成自动流水生产线的话,生产就是流水线的物料,消费就是某种设备对物料进行加工的行为,流水线就是队列。 现在,要写一个体现生产消费模式的泛型帮助类,比如叫Produce...
    99+
    2022-11-13
    C# 泛型队列 Queue 实现生产消费模式
  • C++实现一个简单消息队列的示例详解
    目录前言一、如何实现1、接口定义2、用到的对象3、基本流程二、完整代码三、使用示例线程通信总结前言 消息队列在多线程的场景有时会用到,尤其是线程通信跨线程调用的时候,就可以使用消息队...
    99+
    2022-12-15
    C++实现消息队列 C++消息队列
  • Java实现生产者消费者的两种方式分别是什么
    本篇文章给大家分享的是有关Java实现生产者消费者的两种方式分别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。   我在8年前去面试程序员的时候,一个...
    99+
    2023-06-03
  • python多进程中的生产者和消费者模型怎么实现
    这篇文章主要介绍了python多进程中的生产者和消费者模型怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python多进程中的生产者和消费者模型怎么实现文章都会有所收获,下面我们一起来看看吧。Pytho...
    99+
    2023-07-05
  • java中的wait()和notify()方法实现生产者消费者模式实例
    这篇文章主要介绍“java中的wait()和notify()方法实现生产者消费者模式实例”,在日常操作中,相信很多人在java中的wait()和notify()方法实现生产者消费者模式实例问题上存在疑惑,小编查阅了各式资料,整理出简单好用的...
    99+
    2023-06-20
  • JAVA项目中的生产者消费者如何利用多线程实现
    今天就跟大家聊聊有关JAVA项目中的生产者消费者如何利用多线程实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JAVA多线程实现生产者消费者的实例详解Product.Javapac...
    99+
    2023-05-31
    java 多线程 ava
  • 理解生产者消费者模型及在Python编程中的运用实例
    什么是生产者消费者模型 在 工作中,大家可能会碰到这样一种情况:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产 生数据的模块,就形象地称为生产者...
    99+
    2022-06-04
    生产者 实例 模型
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作