生产者与消费者问题
-
PV操作是用来操作信号量的。
-
P:等待——wait——减法作用——阻塞作用
-
V:释放——signal——加法作用——唤醒作用
-
S.value > 0
:有空闲CPU;S.value = 0
:CPU刚好用完;S.value < 0
:进程等待;-
P操作
void wait(S) { S.value--; if (S.value < 0) { 加入阻塞队列; } }
-
V操作
void signal(S) { S.value++; if (S.value <= 0) { 唤醒阻塞队列第一个进程; } }
-
-
-
解题思路:
1.画图理解题目 2.判断题目类型 3.分析进程数目,填写进程模板 4.补充基本代码 5.补充P,V代码 6.调整代码
-
例:爸爸往桌子上每次放一个苹果,儿子每次从桌子上拿一个苹果,放苹果和拿苹果不能同时进行,桌子上最多放10个苹果,用PV操作实现同步互斥。
-
分析:爸爸——生产者——剩余空间(empty) = 10
儿子——消费者——已占用空间(full) = 0
信号量S = 1,用来实现互斥。
-
特征:①容器 ≤ 容量
②生产 消费
-
伪代码
Dad() { while(1) { P(empty);//判断盘子是否已满 P(S); 放苹果; V(S); V(full);//对
-