问答题 有一个烟草供应商和3个抽烟者。抽烟者若要抽烟,必须具有烟叶、烟纸和火柴。3个抽烟者中,一个有烟叶、一个有烟纸、一个有火柴。烟草供应商会源源不断地分别供应烟叶、烟纸和火柴,并将它们放在桌上。如果他放的是烟纸和火柴,则有烟叶的抽烟者会拾起烟纸和火柴制作香烟,然后抽烟;其他类推。试用信号量同步烟草供应商和3个抽烟者。
【正确答案】Semaphore smoker[3]={0,0,0); //初始0,3个抽烟者 Semaphore material[3]={0,0,0); //初始0,3种原料 Semaphore agent=1; //初始1,供应商 Int turn=0; //初始0,指示轮到哪个抽烟者 Agent() { While(true) { P(agent); //查看是否需要放原料 V(smoker[turn]); //准备放第i个抽烟者所需的原料 V(material[(turn+1)%3]); //放置第一种原料 V(material[(turn+2)%3]); //放置第二种原料 turn=(turn+1)%3; //序号后移,准备放其他抽烟者所需的原料 } } Smoker_i() //第i个抽烟者进程 { While(true) { P(smoker[i]); //查看是否有自己所需的原料 P(material[(i+1)%3]); //拾起原料1 P(material[(i+2)%3]); //拾起原料2 V(agent); //通知供应商原料被取走 Smoke; } }
【答案解析】