独木桥问题
一个主修动物行为学、辅修计算机科学的学生参加了一个课题,调查花果山的猴子是否能被教会理解死锁。他找到一处峡谷,横跨峡谷拉了一根绳索(假设为南北方向)这样猴子就可以攀着绳索越过峡谷。只要它们朝着相同的方向,同一时刻可以有多只猴子通过。但是如果在相反的方向上同时有猴子通过则会发生死锁(这些猴子将被卡在绳索中间,假设这些猴子无法在绳索上从另一只猴子身上翻过去)。如果一只猴子想越过峡谷,它必须看当前是否有别的猴子在逆向通过。请使用P/V 操作来解决该问题。
semaphore bridge,Smutex,Nmutex;
int count;//表示在桥上过桥的数量
bridge.value=1;//桥是临界资源,为表示不同方向互斥访问
Smutex.value=1;//count是临界资源,往南走的进程使用时得保护临界区
Nmutex.value=1;//count是临界资源,往北走的进程使用时得保护临界区
count=0;//初始时过桥的猴子数量为0
cobegin
//往南方向走的猴子进程
procedure South()
{
wait(Smutex);//保护临界区
if(count==0)
wait(bridge);//封锁桥,不让反方向的进入桥
count++;
signal(Smutex);//保护临界区
...
go through the bridge
...
wait(Smutex);//保护临界区
count--;
if(count==0)
signal(bridge); //本方向的猴子走完了,释放桥
signal(Smutex);//保护临界区
}
//往北方向走的猴子进程
procedure North()
{
wait(Nmutex);//保护临界区
if(count==0)
wait(bridge);//封锁桥,不让反方向的进入桥
count++;
signal(Nmutex);//保护临界区
...
go through the bridge
...
wait(Nmutex);//保护临界区
count--;
if(count==0)
signal(bridge); //本方向的猴子走完了,释放桥
signal(Nmutex);//保护临界区
}
coend
苹果橘子问题
桌子上只有一个盘子,每次只能放入一种水果;爸爸专门向盘子里放入苹果,妈妈专门向盘子里放入橘子,一个儿子专吃盘子中的橘子,一个女儿专吃盘子中的苹果;试用信号量机制解决进程的互斥同步问题
//这里分析,对于father和mother而言,盘子是临界资源,同一时刻只能有一个往盘子里放水果
//对于mother和son而言,存在着同步关系,mother放完orange等着son吃,son吃完等着mother放
//同理,对于father和daughter而言,存在同步关系
//这里定义五个信号量,plate表示盘子是互斥的
//m,s用来表示mother和son交叉唤醒
//f,d用来表示father和daughter交叉唤醒
semaphore plate,m,s,f,d;
plate.value=1;
m.value=f.value=1;
s.value=d.value=0;
cobegin
procedure father()
{
while(1)
{
wait(plate);//判断盘子是否可用,锁定盘子
wait(f);//有点奇怪,感觉f在这里很鸡肋
...
put an apple into plate
...
signal(d);//通知daughter有apple可吃
signal(plate);//释放盘子
}
}
procedure mother()
{
while(1)
{
wait(plate);//锁定盘子
wait(m);//有点奇怪,感觉m在这里很鸡肋
...
put an orange into plate
...
signal(s);//通知son可以吃orange
signal(plate);//释放盘子
}
}
procedure son()
{
while(1)
{
wait(s);//等待mother放好orange
...
get an orange from plate to eat
...
signal(m);//通知mother继续放
}
}
procedure daughter()
{
while(1)
{
wait(d);//等待father放好apple
...
get an apple from plate to eat
...
signal(f);//通知father继续放
}
}
coend
快餐厅问题
一个快餐厅有四类职员
(1)领班:接受顾客点菜
(2)厨师:准备顾客的饭菜
(3)打包工:将做好的饭菜打包
(4)出纳员:收款并提交食品
每个职员可以被看作一个进程,请用信号量机制解决进程互斥同步问题
//P1->P2->P3->P4->P1这是一个同步问题
//定义四个信号量S1,S2,S3,S4
semaphore S1,S2,S3,S4;
S1.value=1;
S2.value=S3.value=S4.value=0;
cobegin
procedure P1
{
wait(S1);
...
接受顾客点菜
...
signal(S2);
}
procedure P2
{
wait(S2);
...
准备顾客的饭菜
...
signal(S3);
}
procedure P3
{
wait(S3);
...
将做好的饭菜打包
...
signal(S4);
}
procedure P4
{
wait(S4);
...
收款并提交食品
...
signal(S1);
}
coend