问答题 抽烟问题:有一个烟草代理和三个抽烟者。抽烟者若要抽烟,必须具有烟草、烟纸和火柴。三个抽烟者中,一个缺烟叶、一个缺烟纸、一个缺火柴。烟草代理会源源不断地分别供应烟叶、烟纸和火柴,并将它们放在桌上。如果他放的是烟叶,则缺烟叶的抽烟者会拾起烟叶,制作香烟,然后抽烟;其他类推。试用信号量同步烟草代理和三个抽烟者。
【正确答案】
【答案解析】semaphore smoker[3];//初始0,三个抽烟者
semaphore material[3];//初始0,三种原料
semaphore agent;//初始1,供应商
int turn;//初始0,轮到谁
agent:
while(1) {
wait(agent);
signal(smoker[turn]);
signal(material[(turn+1)%3]);
signal(material[(turn+2)%3]);
turn=(turn+1)%3
}
smoker—i:
while(1) {
wait(smoker[i]);
wait(material[(i+1)%3]);
Wait(material[(i+2)%3]);
signal(agent);
}