温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++怎么实现简单的生产者-消费者队列

发布时间:2023-04-28 16:28:35 来源:亿速云 阅读:127 作者:iii 栏目:开发技术

今天小编给大家分享一下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++怎么实现简单的生产者-消费者队列”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI