同步信号量,“最大容量/剩余容量” 一方消耗,另一方补充 消耗完了补充,补充够了,通知消耗 “最大容量可以从题目得出”
互斥信号量 一方使用,另一方等待 使用前上锁,使用后解锁,一方在使用,另一方等待
1、信号量 2、过程 3、伪代码
互斥信号量盘 plate=1,盘子的互斥使用
同步信号量 水果个数 capacity=1,盘子最多可以放1个水果
同步信号量 橘子个数 orange=0,
同步信号量 苹果个数 apple=0,
void father(){
while(1){
p(capacity) //盘子水果容量-1,盘子放不下了
p(plate)
放苹果
v(apple)
v(plate) //释放盘子
}
}
void mother(){
while(1){
p(capacity) //盘子水果容量-1,盘子放不下了
p(plate)
放橘子
v(orange)
v(plate) //释放盘子
}
}
void daughter(){
while(1){
p(plate)
吃苹果
p(apple)
v(capacity) //盘子水果容量+1,没水果了 通知爸妈任一放水果
v(plate) //释放盘子
}
}
void son(){
while(1){
p(plate)
吃橘子
p(orange)
v(capacity) //盘子水果容量+1,没水果了 通知爸妈任一放水果
v(plate) //释放盘子
}
}
当缓冲区为1的时候我们可以不需要互斥信号量(对盘子的使用),
①在任何时刻,apple、 orange、 capacity 三个同步信号量中最多只有一个是1。因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利地进入临界区…
② 盘子的状态只有0或1两种取值,盘子本身就可以作为互斥信号量
int fruit = 1;
int orange = 0;
int apple = 0;
void father(){
while(1){
p(capacity) //盘子水果容量-1
放苹果
v(apple)
}
}
void mother(){
while(1){
p(capacity) //盘子水果容量-1
放橘子
v(orange)
}
}
void daughter(){
while(1){
p(apple)
吃苹果
v(capacity) //盘子水果容量+1,没水果了 通知爸妈任一放水果
}
}
void son(){
while(1){
p(orange)
吃橘子
v(capacity) //盘子水果容量+1,没水果了 通知爸妈任一放水果
}
}
如果盘子容量是2
参考链接:
https://blog.youkuaiyun.com/weixin_43983838/article/details/105418691
https://blog.youkuaiyun.com/weixin_43914604/article/details/105120888 这个两个盘子或者盘子的容量是2的情况不是很明白