生产者消费者问题c++
时间: 2023-10-18 15:20:14 浏览: 65
生产者消费者问题是一个经典的多线程同步问题,它涉及到两个线程类型:生产者和消费者,它们共享一个缓冲区,生产者往缓冲区中放入数据,消费者从缓冲区中取出数据。但是,当缓冲区满了或者空了,生产者或者消费者就需要等待,直到缓冲区有空间或者有数据。
下面是一个简单的C++程序实现生产者消费者问题:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
using namespace std;
mutex mtx;
condition_variable cv;
queue<int> buffer;
const int buffer_size = 10;
int item_counter = 0;
void producer() {
while (true) {
unique_lock<mutex> lock(mtx);
while (buffer.size() >= buffer_size) {
cv.wait(lock);
}
buffer.push(item_counter++);
cout << "Producing item: " << item_counter-1 << endl;
cv.notify_all();
}
}
void consumer() {
while (true) {
unique_lock<mutex> lock(mtx);
while (buffer.empty()) {
cv.wait(lock);
}
int item = buffer.front();
buffer.pop();
cout << "Consuming item: " << item << endl;
cv.notify_all();
}
}
int main() {
thread t1(producer);
thread t2(consumer);
t1.join();
t2.join();
return 0;
}
```
这个程序使用了互斥量和条件变量来实现线程同步。生产者线程和消费者线程都循环执行,当缓冲区满了或者空了,它们都会调用条件变量的wait()函数来等待,直到缓冲区中有空闲空间或者有数据。
当生产者向缓冲区中放入一个数据时,它会唤醒所有等待在条件变量上的线程,包括消费者线程,让它们去检查缓冲区的状态。同样,当消费者从缓冲区中取出一个数据时,它会唤醒所有等待在条件变量上的线程,包括生产者线程,让它们去检查缓冲区的状态。
这个程序可以通过调整缓冲区的大小来测试不同情况下的表现。