完成pv操作生产者消费者问题
时间: 2023-06-16 16:04:42 浏览: 274
生产者消费者问题是一个经典的线程同步问题,它涉及到两种类型的线程,生产者和消费者,它们共享一个有限的缓冲区。生产者线程将数据放入缓冲区,而消费者线程则从缓冲区中取出数据。
在实现生产者消费者问题时,需要使用同步机制来保证线程之间的正确协作。常见的同步机制有信号量、互斥锁、条件变量等。
下面是一个使用互斥锁和条件变量实现的生产者消费者问题的代码:
```c++
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;
const int BUFFER_SIZE = 10;
queue<int> buffer;
mutex mtx;
condition_variable not_full_cv, not_empty_cv;
void producer(int id)
{
while (true) {
unique_lock<mutex> lck(mtx);
not_full_cv.wait(lck, []{ return buffer.size() < BUFFER_SIZE; });
buffer.push(id);
cout << "Producer " << id << " produced, buffer size: " << buffer.size() << endl;
not_empty_cv.notify_all();
lck.unlock();
// 生产者休眠一段时间
this_thread::sleep_for(chrono::milliseconds(1000));
}
}
void consumer(int id)
{
while (true) {
unique_lock<mutex> lck(mtx);
not_empty_cv.wait(lck, []{ return buffer.size() > 0; });
int data = buffer.front();
buffer.pop();
cout << "Consumer " << id << " consumed " << data << ", buffer size: " << buffer.size() << endl;
not_full_cv.notify_all();
lck.unlock();
// 消费者休眠一段时间
this_thread::sleep_for(chrono::milliseconds(1500));
}
}
int main()
{
thread p1(producer, 1);
thread p2(producer, 2);
thread c1(consumer, 1);
thread c2(consumer, 2);
p1.join();
p2.join();
c1.join();
c2.join();
return 0;
}
```
在这个代码中,生产者和消费者分别由不同的线程函数 `producer` 和 `consumer` 实现。生产者线程不断将数据放入缓冲区,直到缓冲区满了就等待消费者线程取走数据,而消费者线程则不断从缓冲区中取出数据,直到缓冲区为空就等待生产者线程放入数据。
在实现中,使用了互斥锁 `mtx` 来保证对缓冲区的访问是线程安全的,使用条件变量 `not_full_cv` 和 `not_empty_cv` 来实现线程之间的等待和唤醒。其中,`not_full_cv` 用于生产者线程等待缓冲区不满,`not_empty_cv` 用于消费者线程等待缓冲区不为空。在生产者线程向缓冲区中放入数据时,使用 `not_empty_cv.notify_all()` 来通知消费者线程可以开始取数据了;在消费者线程从缓冲区中取出数据时,使用 `not_full_cv.notify_all()` 来通知生产者线程可以开始放数据了。
阅读全文