理发师问题
一个理发师,一把理发椅,n把等候理发的顾客椅子。
(1)如果没有顾客则理发师便在理发椅上睡觉
(2)当有一个顾客到达时,首先看理发师在干什么,
如果理发师在睡觉,则唤醒理发师理发;
如果理发师正在理发,则查看是否有空的顾客椅子可坐,
如果有,坐下等待,如果没有,则离开。
(3)理发师为一位顾客理完发后,查看是否有人在等待,
如果有则唤醒下一位顾客理发,没有则理发师去睡觉
customers=0; //顾客等待服务的信号量
barber=0; //理发师等待顾客的信号量
mutex=1; //互斥信号量
waiting=0; //等待理发的顾客数
CHAIRS=n; //表示椅子的总数为n
process barber
begin
while true do
begin
p(customers); //顾客数为0,则入睡
P(mutex); //进入临界区
waiting := waiting - 1; //减少顾客数
V(barber); //理发师准备理发
V(mutex);
Cut_hair();
End;
End;
process customer
begin
P(mutex); //进入临界区
if(waiting < CHAIRS)
begin
waiting := waiting + 1; //增加顾客数
V(customers); //如有必要,则唤醒理发师
V(mutex); //释放信号量mutex
P(barber); //如果无顾客,则理发师入睡
Get_hair(); //进入理发店理发
End;
else
V(mutex); //已满,离开
End;
因篇幅问题不能全部显示,请点此查看更多更全内容