用c++写一个消费者生产者模式的例子
时间: 2023-12-04 20:01:59 浏览: 37
当然,这里是一个简单的用C++编写的消费者生产者模式的例子:
```cpp
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
std::queue<int> buffer;
const int bufferSize = 10;
std::mutex mtx;
std::condition_variable bufferNotEmpty, bufferNotFull;
void producer() {
for (int i = 1; i <= 20; ++i) {
std::unique_lock<std::mutex> lock(mtx);
bufferNotFull.wait(lock, [] { return buffer.size() < bufferSize; });
buffer.push(i);
std::cout << "Producer produced item: " << i << std::endl;
lock.unlock();
bufferNotEmpty.notify_one();
}
}
void consumer() {
for (int i = 1; i <= 20; ++i) {
std::unique_lock<std::mutex> lock(mtx);
bufferNotEmpty.wait(lock, [] { return !buffer.empty(); });
int item = buffer.front();
buffer.pop();
std::cout << "Consumer consumed item: " << item << std::endl;
lock.unlock();
bufferNotFull.notify_one();
}
}
int main() {
std::thread producerThread(producer);
std::thread consumerThread(consumer);
producerThread.join();
consumerThread.join();
return 0;
}
```
在这个例子中,我们使用`std::queue`作为缓冲区,`std::mutex`来保护共享资源的访问,`std::condition_variable`用于线程间的同步通信。
生产者函数`producer()`负责将数字1到20依次放入缓冲区中,每次放入一个数字后,会通知消费者线程。
消费者函数`consumer()`负责从缓冲区中取出数字并消费,每次消费一个数字后,会通知生产者线程。
在`main()`函数中,我们创建了一个生产者线程和一个消费者线程,并等待它们的执行完毕。
请注意,这只是一个简单的示例,实际使用中可能需要更复杂的逻辑来处理并发和同步。