【正确答案】本题考查用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 fan1(){ //第1队音乐爱好者 while(TRUE){ P(buy1); //等待有音乐磁带和电池出售 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
【答案解析】