桌子上有一只盘子,最多可容纳两个水果,每次只能放入或取出一个水果。爸爸专向盘子放苹果(apple),妈妈专向盘子放桔子(orange)。两个儿子专等吃盘子中的桔子,两个女儿专等吃盘子中的苹果。请用信号量来实现爸爸、妈妈、儿子、女儿之间的同步与互斥关系。
解:本题原型为生产者-消费者问题,只是由一种产品改为两种水果,所以将表示满缓冲区单元个数的一个信号量改为表示盘中苹果的个数和桔子个数的两个信号量,设置如下信号量:
empty:记录允许向盘子中放入水果的个数,初值为2。
apple:盘子中已放入的苹果的个数,初值为0。
orange:盘子中已放入的桔子的个数,初值为0。
mutex:向盘子中取、放操作是一个互斥操作,也就是说盘子对于取、放水果而言是一个临界资源,为此设置一个信号量,其初值为1。
本题4个进程的同步与互斥活动的描述如下:
Var mutex, empty, apple, orange:=1,2,0,0
Begin
Father:begin
Repeat
wait(empty); //盘中可放入的水果数
wait(mutex); //申请向盘中取、放水果
向盘中放苹果;
signal(mutex); signal(apple); end
Mother:begin
Repeat
wait (empty); wait (mutex); 向盘中放桔子;
signal (mutex); //允许向盘中取、放水果 //递增盘中的苹果数
//减少盘中可放入的水果数//申请向盘中取、放水果
//允许向盘中取、放水果
signal (orange); //递增盘中的桔子数
end
Daughteri(i=1,2):begin //两女儿进程
Repeat
wait(apple); wait (mutex); 取盘中苹果;
signal (mutex); signal (empty); end
Sonj(j=1,2):begin Repeat
wait (orange); //减少盘中苹果数
//申请向盘中取、放水果
//允许向盘中取、放水果
//递增盘中可放入的水果数 //两儿子进程
//减少盘中桔子数
wait (mutex); //申请向盘中取、放水果
取盘中桔子;
signal (mutex); //允许向盘中取、放水果
signal (empty); //递增盘中可放入的水果数
end
end
和尚取水:
Var Semaphore: mutex1=1;mutex2=1; empty=10;full=0;pail=3;
Begin
parbegin
Get() //小和尚取水
Repeat
wait(empty)
wait(pail)
wait(mutex1)
从井中取水;
signal (mutex1)
wait(mutex2)
将水倒入缸中;
signal (mutex2)
signal (full)
signal (pail)
parend
parbegin
Use() //老和尚喝水
Repeat
wait(full)
wait(pail)
wait(mutex2)
从缸中取水
signal (mutex2) ;
signal (empty)
喝水
signal (pail)
parend
因篇幅问题不能全部显示,请点此查看更多更全内容