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();
}