生产者消费者问题c++
时间: 2023-08-03 14:33:07 浏览: 121
生产者消费者问题是一种经典的并发控制问题,主要用于描述共享资源的访问与同步。
在C++中,可以使用线程和互斥锁来实现生产者消费者问题。具体实现方法如下:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
using namespace std;
mutex mtx;
condition_variable cv;
queue<int> q;
int maxSize = 10;
void producer()
{
for(int i = 0; i < 20; i++)
{
unique_lock<mutex> lock(mtx);
cv.wait(lock, [](){return q.size() < maxSize;});
q.push(i);
cout << "Producer: " << i << endl;
cv.notify_all();
}
}
void consumer()
{
while(true)
{
unique_lock<mutex> lock(mtx);
cv.wait(lock, [](){return !q.empty();});
int val = q.front();
q.pop();
cout << "Consumer: " << val << endl;
cv.notify_all();
}
}
int main()
{
thread t1(producer);
thread t2(consumer);
t1.join();
t2.join();
return 0;
}
```
以上代码实现了一个简单的生产者消费者模型,其中`producer()`函数负责生产数据,`consumer()`函数负责消费数据。在`main()`函数中,创建了两个线程`t1`和`t2`分别对应生产者和消费者,通过调用`join()`函数等待线程执行完毕。
在生产者和消费者之间使用`queue`存储数据,通过互斥锁`mtx`来保证共享资源的访问,使用条件变量`cv`来实现线程之间的同步和通信。在生产者函数中,使用`cv.wait()`函数来等待消费者通知,当队列长度小于最大值时,生产者将新数据加入队列,并通过`cv.notify_all()`函数通知消费者。在消费者函数中,使用`cv.wait()`函数来等待生产者通知,当队列非空时,消费者将队首数据取出并打印,并通过`cv.notify_all()`函数通知生产者。
以上就是一个简单的生产者消费者模型的实现。
阅读全文