能否提供一个完整的C++代码示例,展示生产者和消费者问题的经典实现?
时间: 2024-10-26 08:16:35 浏览: 28
当然可以,生产者消费者问题是一个经典的并发控制问题,它涉及到两个线程角色:一个生产者负责生成任务放入缓冲区,另一个消费者负责从缓冲区取出并处理这些任务。这里是一个简单的C++代码示例,使用了`std::queue`作为缓冲区:
```cpp
#include <thread>
#include <queue>
#include <mutex> // 使用互斥锁防止数据竞争
#include <condition_variable> // 使用条件变量唤醒等待线程
// 生产者函数
void producer(std::queue<int>& queue, std::mutex& mutex, std::condition_variable& cv, int count) {
for (int i = 0; i < count; ++i) {
std::unique_lock<std::mutex> lock(mutex);
while (queue.size() == MAX_QUEUE_SIZE) { // 当队列满时,生产者等待
cv.wait(lock); // 等待直到有消费者消费
}
queue.push(i); // 生产元素
std::cout << "Producer produced item " << i << "\n";
lock.unlock(); // 解锁后发布信号通知消费者
cv.notify_one();
}
}
// 消费者函数
void consumer(std::queue<int>& queue, std::mutex& mutex, std::condition_variable& cv) {
while (true) {
std::unique_lock<std::mutex> lock(mutex);
if (queue.empty()) { // 当队列空时,消费者等待
cv.wait(lock);
} else {
int item = queue.front(); // 消费元素
queue.pop();
std::cout << "Consumer consumed item " << item << "\n";
lock.unlock(); // 解锁后发布信号通知生产者
cv.notify_one();
}
}
}
int main() {
const int MAX_QUEUE_SIZE = 5;
std::queue<int> queue;
std::mutex mtx;
std::condition_variable cv;
std::thread producer_thread(producer, std::ref(queue), std::ref(mtx), std::ref(cv), MAX_QUEUE_SIZE * 2);
std::thread consumer_thread(consumer, std::ref(queue), std::ref(mtx), std::ref(cv));
producer_thread.join();
consumer_thread.join();
return 0;
}
```
在这个例子中,`MAX_QUEUE_SIZE`是缓冲区的最大容量,生产者和消费者通过互斥锁和条件变量协调操作,保证了资源的有效管理。
阅读全文