生产者消费者问题c++
时间: 2023-10-18 16:17:48 浏览: 17
生产者消费者问题是一个经典的多线程同步问题,主要涉及到两个角色:生产者和消费者。生产者生产数据,消费者消费数据。但是由于生产者和消费者运行在不同的线程中,因此需要考虑线程同步的问题。
以下是一个基本的C++实现:
```c++
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;
// 缓冲区大小
const int BUFFER_SIZE = 10;
// 缓冲区
queue<int> buffer;
// 互斥锁
mutex buffer_mutex;
// 条件变量
condition_variable buffer_not_full;
condition_variable buffer_not_empty;
// 生产者
void producer() {
for (int i = 0; i < 20; ++i) {
// 生产数据
int data = i;
// 获取互斥锁
unique_lock<mutex> lock(buffer_mutex);
// 如果缓冲区已满,等待
while (buffer.size() == BUFFER_SIZE) {
buffer_not_full.wait(lock);
}
// 将数据插入缓冲区
buffer.push(data);
cout << "Producer produced data: " << data << endl;
// 通知消费者可以消费数据
buffer_not_empty.notify_all();
}
}
// 消费者
void consumer() {
while (true) {
// 获取互斥锁
unique_lock<mutex> lock(buffer_mutex);
// 如果缓冲区为空,等待
while (buffer.empty()) {
buffer_not_empty.wait(lock);
}
// 从缓冲区取出数据
int data = buffer.front();
buffer.pop();
cout << "Consumer consumed data: " << data << endl;
// 通知生产者可以继续生产数据
buffer_not_full.notify_all();
}
}
int main() {
// 创建生产者线程和消费者线程
thread producer_thread(producer);
thread consumer_thread(consumer);
// 等待线程结束
producer_thread.join();
consumer_thread.join();
return 0;
}
```
在上面的代码中,我们使用了一个标准库中的队列来作为缓冲区,使用了互斥锁来保证线程同步,使用了条件变量来进行线程间通信。生产者线程不断地生产数据,如果缓冲区已满,则等待消费者线程消费数据。消费者线程不断地消费数据,如果缓冲区为空,则等待生产者线程生产数据。通过互斥锁和条件变量的协作,我们可以实现生产者和消费者线程的同步。
相关推荐
![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)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![gz](https://img-home.csdnimg.cn/images/20210720083447.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)