理发师问题的求解:
(1)一个理发店接待室有n张椅子,工作室有1张椅子;
(2)没有顾客时,理发师睡觉;
(3)第一个顾客来到时,必须将理发师唤醒;
(4)顾客来时如果还有空座的话,他就坐在一个座位上等待;
(5)如果顾客来时没有空座位了,他就离开,不理发了;
(6)当理发师处理完所有顾客,而又没有新顾客来时,他又开始睡觉。
var mutex,barber,wakeup:semaphore:=1,0,0;
empty:integer:=n+1; //empty表示空座位的数量,接待室加上工作室共n+1个座位
begin
parbegin
customer:begin
wait(mutex); //mutex控制对empty的互斥访问
if empty=0 then begin //如果没有空座,顾客走人,不理发了
signal(mutex); exit();
end
else begin
empty:=emtpy-1;
if empty=n-1 then begin
signal(wakeup); //如果是第一个顾客,得叫醒理发师
signal(mutex);
end
else begin
signal(mutex);
wait(barber); //第一个顾客不用等待,后续的顾客需要等待理发师腾出手来
end
理发;
end //对应else begin
end //customer进程结束
barber: begin
wait(wakeup); //初始状态,理发师在睡觉,一旦被唤醒,就进入下边这个无限循环
repeat
理发; //被唤醒了,直接给第一个顾客理发
wait(mutex); //收拾完一个,要修改空座的数量,争夺empty的控制权
empty:=empty+1;
if empty
signal(barber); //表示理发师腾出手来了
signal(mutex);
end
else begin
signal(mutex);
wait(wakeup); //没顾客了,睡觉去,等待唤醒
end //对应else begin
until false;
end //barber进程结束
parend
end