进程同步问题实例(参考):
1、 桌上有个能盛得下五个水果的空盘子,爸爸不停地向盘中放苹果或桔子,儿子不停地从盘中取出桔子享用,女儿不停地从盘中取出苹果享用。规定三人不能同时从盘中取放水果。试用信号量实现爸爸、儿子和女儿这三个循环进程之间的同步。
分析:本题是生产者—消费者问题的变形,相当于一个能生产两种产品的生产者(爸爸)向两个消费者(儿子和女儿)提供产品的同步问题,因此,需设置两个不同的full信号量apple和orange,初值均为0。
Semaphore empty=5,orange=0,apple=0,mutex=1;
Int buffer[5];
Dad(){
Int nextp;
While(1){
Wait(empty);
Wait(mutex);
Buffer[in]:=nextp;
Signal(mutex);
If(buffer[in]=orange)
Signal(orange);
Else signal(apple);
}
}
Son(){
Int nexts;
While(1){
Wait(orange);
Wait(mutex);
Nexts:=buffer(out);
Signal(mutex);
Signal(empty);
Eat;
}
}
2、 请用信号量解决以下的“过独木桥”问题:同一方向的行人可连续过桥,当某一方向有人过桥时,另一方向的行人必须等待;当某一方向无人过桥时,另一方向的行人可以过桥。
Semaphore bridge=1;(用来实现不同方向行人对桥的互斥共享)
Semaphore mutexA=mutexB=1;
Int countA=countB=0;(分别表示A、B两个方向过桥的行人数量)
PA(){
Wait(mutexA);
If(countA==0) wait(bridge);
countA++;
signal(mutexA);
过桥;
Wait(mutexA);
countA--;
if(countA==0)signal(bridge);
signal(mutexA);
}
B方向行人的算法与A方向行人算法类似。
3、 有一间酒吧里有3个音乐爱好者队列,第1队的音乐爱好者只有随身听,第2队的音乐爱好者只有音乐磁带,第3队的音乐爱好者只有电池。而要听音乐就必须随身听、音乐磁带和电池这三种物品俱全。酒吧老板一次出售这三种物品中的任意两种。当一名音乐爱好者得到这三种物品并听完一首乐曲后,酒吧老板才能再一次出售这三种物品中的任意两种,于是第2队音乐爱好者得到这三种物品,并开始听乐曲。全部买卖就这样进行下去。试用信号量实现他们的同步关系。
分析:根据题意,当酒吧老板提供两种物品时,必须被同一个音乐爱好者取走,我们应把每两种物品看成是一组合起来的临界资源。三个队为它设置一个临界资源信号量S1,S2,S3的初值为0。只有当一个音乐爱好者听完一首乐曲后,老板才能再次出售商品,为这种同步关系设置一个初值为0的信号量
music_over。
Semaphore S1=S2=S3=0;
Semaphore music_over=0;
Boss(){
While(1){
提供任意两种物品出售;
IF(提供的是音乐磁带和电池)signal(S1);
Else if (提供的是随身听和电池)signal(S2);
Else signal(S3);
Wait(music_over);
}
}
Fan1(){
Wait(S1);
买音乐磁带和电池;
听乐曲;
Signal(music_over);
}
Fan2(){
Wait(S2);
买随身听和电池;
听音乐;
Signal(music_over);
}
Fan3(){
Wait(S3);
买到随身听和音乐磁带;
听乐曲;
Signal(music_over);
}
Main(){
Cobegin
Boss(); fan1(); fan2(); fan3();
Coend;}