目录
生产者消费者模式(Producer-Consumer Pattern)是一种非常常见的并发设计模式,用于协调生产者和消费者之间的工作流程,以平衡工作负载。在这种模式中,生产者负责生成数据,消费者则负责处理数据。核心的目的是确保生产者不会在没有地方存储生产的数据时继续生产,而消费者在没有数据可用时不会进行消费。
工作原理
生产者和消费者通过一个共享的缓冲区(通常是队列)进行通信。生产者生成数据并放入缓冲区,消费者从缓冲区取出数据进行处理。为了避免竞争条件和资源冲突,需要适当的同步机制来控制对共享资源(缓冲区)的访问。这通常通过锁(互斥量)和条件变量来实现。
主要组件
- 共享缓冲区:通常实现为队列,用于生产者存放数据和消费者取数据。
- 锁(互斥量):防止生产者和消费者同时修改共享资源。
- 条件变量:用于协调生产者和消费者之间的活动。例如,当缓冲区满时,生产者等待;缓冲区空时,消费者等待。
代码示例
下面是使用C++的标准库(C++11及以上)实现的生产者消费者模式的一个简单示例:
#include <iostream>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
std::queue<int> product;
void producer(int id) {
for (int i = 0; i < 5; ++i) {
std::unique_lock<std::mutex> lock(mtx);
product.push(i);
std::cout << "Producer " << id << " produced " << i << std::endl;
lock.unlock();
cv.notify_one(); // 通知消费者
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
void consumer(int id) {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return !product.empty(); }); // 等待直到有产品
int value = product.front();
product.pop();
std::cout << "Consumer " << id << " consumed " << value << std::endl;
lock.unlock();
if (value == 4) break; // 假设当消费到某个值时退出
}
}
int main() {
std::thread t1(producer, 1);
std::thread t2(consumer, 1);
t1.join();
t2.join();
return 0;
}
在这个例子中,我们创建了一个生产者和一个消费者。生产者生产一系列数字,然后放入队列中。消费者从队列中取出数字并消费它们。使用互斥量和条件变量来保证生产者和消费者之间正确的同步和通信。