今天小编给大家分享一下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(); }