理发师睡觉问题理发师问题的描述:
一个理发店接待室有n张椅子,工作室有1张椅子;
没有顾客时,理发师睡觉;
第一个顾客来到时,必须将理发师唤醒;
顾客来时如果还有空座的话,他就坐在一个座位上等待;
如果顾客来时没有空座位了,他就离开,不理发了;
当理发师处理完所有顾客,而又没有新顾客来时,他又开始睡觉。
现在各种参考书上比较时兴的解决理发师问题的算法大概其就是下边这个算法,不同版本大同小异吧。
var mutex,barber,wakeup:semaphore:=1,0,0;
empty:integer:=n...
理发师问题的描述:
一个理发店接待室有n张椅子,工作室有1张椅子;
没有顾客时,理发师睡觉;
第一个顾客来到时,必须将理发师唤醒;
顾客来时如果还有空座的话,他就坐在一个座位上等待;
如果顾客来时没有空座位了,他就离开,不理发了;
当理发师处理完所有顾客,而又没有新顾客来时,他又开始睡觉。
现在各种参考书上比较时兴的解决理发师问题的算法大概其就是下边这个算法,不同版本大同小异吧。
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
本文档为【理发师睡觉问题】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。