进程同步实验生产者消费者问题
时间: 2023-09-29 08:03:03 浏览: 129
生产者消费者问题是一个经典的进程同步问题,它描述了多个进程之间共享一个有限缓冲区时的同步问题。
在该问题中,有两种类型的进程:生产者和消费者。生产者进程负责向缓冲区中添加数据,而消费者进程则负责从缓冲区中消耗数据。缓冲区有一个固定的大小,可以保存一定数量的数据项。当缓冲区已满时,生产者需要等待消费者从缓冲区中取出一些数据。当缓冲区为空时,消费者需要等待生产者将一些数据放入缓冲区中。
为了解决生产者和消费者之间的同步问题,可以使用一些同步原语,例如信号量、互斥锁等。以下是一个使用互斥锁和条件变量的生产者消费者问题的示例代码:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
std::mutex mtx;
std::condition_variable cv;
std::queue<int> buffer;
const int buffer_size = 10;
void producer(int id) {
for (int i = 0; i < 20; ++i) {
std::unique_lock<std::mutex> lock(mtx);
while (buffer.size() >= buffer_size) {
cv.wait(lock);
}
buffer.push(i);
std::cout << "Producer " << id << " produced " << i << std::endl;
cv.notify_all();
}
}
void consumer(int id) {
for (int i = 0; i < 20; ++i) {
std::unique_lock<std::mutex> lock(mtx);
while (buffer.empty()) {
cv.wait(lock);
}
int item = buffer.front();
buffer.pop();
std::cout << "Consumer " << id << " consumed " << item << std::endl;
cv.notify_all();
}
}
int main() {
std::thread p1(producer, 1);
std::thread p2(producer, 2);
std::thread c1(consumer, 1);
std::thread c2(consumer, 2);
p1.join();
p2.join();
c1.join();
c2.join();
return 0;
}
```
在该示例中,生产者和消费者进程使用了互斥锁来保护共享缓冲区,条件变量用于同步生产者和消费者进程的操作。生产者进程在缓冲区已满时等待,消费者进程在缓冲区为空时等待,当生产者向缓冲区中添加数据或消费者从缓冲区中取出数据时,通知其他进程进行操作。
阅读全文