文档库 最新最全的文档下载
当前位置:文档库 › pv操作例题2

pv操作例题2

理发师问题的求解:
(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

相关文档