在一间酒吧里有3个音乐爱好者队列,第1队的音乐爱好者只有随身听,第2队只有音乐磁带,第3队只有电池。而要听音乐就必须随身听、音乐磁带和电池这3种物品俱全。酒吧老板一次出售这3种物品中的任意两种。当一名音乐爱好者得到这3种物品并听完一首乐曲后,酒吧老板才能再

admin2018-08-12  38

问题 在一间酒吧里有3个音乐爱好者队列,第1队的音乐爱好者只有随身听,第2队只有音乐磁带,第3队只有电池。而要听音乐就必须随身听、音乐磁带和电池这3种物品俱全。酒吧老板一次出售这3种物品中的任意两种。当一名音乐爱好者得到这3种物品并听完一首乐曲后,酒吧老板才能再一次出售这3种物品中的任意两种。于是第2名音乐爱好者得到这3种物品,并开始听乐曲。全部买卖就这样进行下去。试用P、V操作正确解决这一买卖。

选项

答案本题考查用P、V操作解决进程的同步互斥问题。 (1)第1队音乐爱好者要竞争“待出售的音乐磁带和电池”,而且在初始状态下系统并无“待出售的音乐磁带和电池”,故可为该种资源设置一初值为0的信号量buy1;同样,需设置初值为0的buy2、buy3分别对应“待出售的随身听和电池”、“待出售的随身听和音乐磁带”。另外,为了同步买者的付费动作和卖者的给货动作,还需设置信号量payment和goods,以保证买者在付费后才能得到所需商品。信号量music_over用来同步音乐爱好者听乐曲和酒吧老板的下一次出售行为。 (2)具体的算法描述如下: semaphore buy1=buy2=buy3=0. semaphore payment=0; semaphore goods=0; semaphore music_over=0; cobegin{ process boss(){ //酒吧老板 while(TRUE){ 拿出任意两种物品出售; if(出售的是音乐磁带和电池)V(buy1); else if(出售的是随身听和电池)V(buy2); else if(出售的是随身听和音乐磁带)V(buy3); P(payment); //等待付费 V(goods); //给货 P(music_over); //等待乐曲结束 } } process fanl(){ //第1队音乐爱好者 while(TRUE){ P(buyl); //等待有音乐磁带和电池出售 V(payment); //付费 P(goods); //取货 欣赏一曲乐曲; V(music—over); //通知老板乐曲结束 } } process fan2(){ //第2队音乐爱好者 while(TRUE){ P(buy2); //等待有随身听和电池出售 V(payment); //付费 P(goods); //取货 欣赏一曲乐曲; V(music_over); //通知老板乐曲结束 } } process fan3(){ //第3队音乐爱好者 while(TRUE){ P(buy3); //等待有随身听和音乐磁带出售 V(payment); //付费 P(goods); //取货 欣赏一曲乐曲; V(music_over); //通知老板乐曲结束 } } }coend

解析
转载请注明原文地址:https://kaotiyun.com/show/5rRi777K
0

最新回复(0)