生产者消费者问题c++
时间: 2023-10-18 19:12:14 浏览: 32
生产者消费者问题是一个经典的同步问题,它涉及到两个或多个线程之间的协作。生产者线程生成数据,消费者线程消费数据。这些线程必须协调彼此的活动,以避免竞争条件或死锁。
在C++中,可以使用线程和互斥锁来解决生产者消费者问题。以下是一个简单的示例程序,其中有两个线程:生产者和消费者。生产者将数字放入缓冲区,消费者从缓冲区中取出数字。
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
std::mutex mtx; // 互斥锁
std::condition_variable cv; // 条件变量
std::queue<int> buffer; // 缓冲区
int max_buffer_size = 10; // 缓冲区最大容量
void producer(int id) {
for (int i = 0; i < 100; ++i) {
std::unique_lock<std::mutex> lock(mtx); // 获取互斥锁
while (buffer.size() >= max_buffer_size) { // 如果缓冲区已满,等待
cv.wait(lock);
}
buffer.push(i); // 将数字放入缓冲区
std::cout << "Producer " << id << " produced " << i << std::endl;
cv.notify_all(); // 通知消费者线程
}
}
void consumer(int id) {
while (true) {
std::unique_lock<std::mutex> lock(mtx); // 获取互斥锁
while (buffer.empty()) { // 如果缓冲区为空,等待
cv.wait(lock);
}
int num = buffer.front(); // 从缓冲区中取出数字
buffer.pop();
std::cout << "Consumer " << id << " consumed " << num << std::endl;
cv.notify_all(); // 通知生产者线程
}
}
int main() {
std::thread producer1(producer, 1); // 创建生产者线程1
std::thread producer2(producer, 2); // 创建生产者线程2
std::thread consumer1(consumer, 1); // 创建消费者线程1
std::thread consumer2(consumer, 2); // 创建消费者线程2
producer1.join(); // 等待生产者线程1结束
producer2.join(); // 等待生产者线程2结束
consumer1.join(); // 等待消费者线程1结束
consumer2.join(); // 等待消费者线程2结束
return 0;
}
```
在上面的示例程序中,生产者线程使用while循环检查缓冲区是否已满,如果已满,则等待。消费者线程使用while循环检查缓冲区是否为空,如果为空,则等待。当生产者线程向缓冲区中放入数据时,它会通知等待的消费者线程。当消费者线程从缓冲区中取出数据时,它会通知等待的生产者线程。这样,生产者和消费者线程就可以协调彼此的活动,避免竞争条件或死锁。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![text/x-c](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)