继续盘一盘进程互斥中生产者和消费者的问题😎
1.问题描述
有三个对象
- 生产者进程
- 缓冲区
- 消费者进程
规则
- 缓冲区为满,挂起生产者进程(同步关系)
- 缓冲区为空, 挂起消费者进程 (同步关系)
问题
- 存在 多个生产者同时向同一缓冲区的 同一位置写入数据的问题,所以需要互斥的区访问这个同一缓冲区位置 (互斥关系)
2.实现过程
定义三个信号量
semaphore mutext = 1; // 互斥信号量,实现对缓冲区的互斥访问
semaphore empty = n; // 同步信号量,表示空闲缓冲区的数量
semaphore full = 0; // 同步信号量,表示非空闲区缓冲区的数量
producer(){
while(1){
生产一个产品;
P(empty); // 消耗一个 空闲缓冲区
P(mutex);
把产品放入缓冲区;
V(mutex);
V(full); // 增加一个产品
}
}
consumer(){
while(1){
P(full); // 消耗一个产品
P(mutex);
从缓冲区取出一个产品;
V(mutex);
V(empty); // 增加一个空闲缓冲区
使用产品;
}
}
注意 实现互斥的p操作 一定要在 实现同步的p操作之后,不然会发生 死锁