生产者消费者问题c++
时间: 2023-10-18 14:20:25 浏览: 17
生产者消费者问题是一个经典的多线程同步问题,其中生产者线程负责生产数据并存放到缓冲区中,而消费者线程负责从缓冲区中取出数据进行消费,需要保证生产者和消费者之间的数据同步和互斥。
下面是一个简单的 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;
void producer() {
for (int i = 0; i < 20; ++i) {
unique_lock<mutex> lock(mtx);
cv.wait(lock, []{ return buffer.size() < buffer_size; }); // 等待缓冲区有空位
buffer.push(i);
cout << "Producer produced " << i << endl;
lock.unlock();
cv.notify_all(); // 通知消费者线程
}
}
void consumer() {
for (int i = 0; i < 20; ++i) {
unique_lock<mutex> lock(mtx);
cv.wait(lock, []{ return !buffer.empty(); }); // 等待缓冲区不为空
int data = buffer.front();
buffer.pop();
cout << "Consumer consumed " << data << endl;
lock.unlock();
cv.notify_all(); // 通知生产者线程
}
}
int main() {
thread t1(producer);
thread t2(consumer);
t1.join();
t2.join();
return 0;
}
```
在这个实现中,我们使用了一个互斥锁 `mtx` 和一个条件变量 `cv` 来实现线程之间的同步和互斥。生产者线程首先获得互斥锁,并等待条件变量,即缓冲区有空位。当缓冲区有空位时,生产者线程将数据存入缓冲区,并释放互斥锁,通知消费者线程可以开始消费。消费者线程同样获得互斥锁,并等待条件变量,即缓冲区不为空。当缓冲区不为空时,消费者线程从缓冲区中取出数据进行消费,并释放互斥锁,通知生产者线程可以开始生产。这样,我们就实现了生产者消费者模型的同步和互斥。