理髮師睡覺問題

2022-10-14 20:21:09 字數 2438 閱讀 7606

理髮師問題的描述:

乙個理髮店接待室有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();

endelse begin

empty:=emtpy-1;

if empty=n-1 then begin

signal(wakeup); //如果是第乙個顧客,得叫醒理髮師

signal(mutex);

endelse 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);

endelse begin

signal(mutex);

wait(wakeup); //沒顧客了,睡覺去,等待喚醒

end //對應else begin

until false;

end //barber程序結束

parend

end我感覺這個演算法有點問題,因為customer程序中的「理髮」語句和barber程序中的「理髮」語句並不同步,當兩個程序進入執行這兩個語句的狀態時,實際上已經失去了同步性。比如說,customer程序中的「理髮」語句先執行完了,那麼此時barber在給誰理髮呢,barber中的「理髮」語句執行還有什麼意義呢?反之亦然。

所以,我認為必須用生產者、消費者模型才能完美地解決這個問題。基本思想是:多個顧客就是多個生產者,來到時將自己放入有n個緩衝區的緩衝池,而理髮師是消費者,不斷地從緩衝區中取出顧客,將其消費掉。

這樣,理髮師所提供的服務和消費者所接受的服務才是完美地同步進行,而不會出現上面那種顧客已經走了,理髮師還在空轉的現象。演算法如下:

var customers:array[0...n-1] of customer;

empty,in,out:integer:=n,0,0;

wakeup,mutex:semaphore:=0,1; //mutex控制對緩衝池,empty,in,out的互斥訪問

begin

parbegin

customer:begin

wait(mutex);

if empty=0 then begin

signal(mutex); exit();

endelse begin

customers[in]:=a_customer;

in:=(in+1) mod n;

empty:=empty-1;

if empty=n-1 then signal(wakeup);

signal(mutex);

endendbarber:begin

wait(wakeup);

repeat

wait(mutex);

if empty=n then begin

signal(mutex);

wait(wakeup);

endelse begin

a_customer:=customer[out]; //相當於將顧客從接待室領到工作室

out:=(out+1) mod n;

empty:=empty+1;

signal(mutex);

將此customer消費掉,即給他理髮;

enduntil false;

endparendend

理髮師的職業危害

隨著生活水平的提高,人們對美的渴望使得美容美髮業得到很快發展 多數理髮店兼美容 美髮於一體,且數量不斷增加,理髮店的規模和裝潢也有一定的改善。但多數理髮店側重外部的裝潢而忽視了內部合理設計 室內通風 消毒設施的配置。理髮用具與座椅也不符合衛生和工效學要求,直接影響職業理髮師的健康。由於理髮師隊伍的不...

個別化學習計畫 理髮師

理髮師小五班 核心經驗 的關鍵詞 情感願意理髮 學做理髮師 認知常見的理髮工具 理髮師的勞動 活動例項 1.學理髮 2.理髮店 3.美麗的髮套 4.小羊美容院 5.誰該理髮了 6.理髮 例項一 學理髮 源自 學習活動 p165 材料1.各種玩具 梳子 推子 吹風機 小剪刀 小圍兜等 2.裝飾物 蝴蝶...

睡眠理髮師課程設計報告

作業系統 課程設計報告 專業 電腦科學與技術 班級 08 計本 2 班 題目名稱 理髮師問題 完成日期 2011 6 甘肅政法學院電腦科學學院 目錄一.題目內容 2 二.課程設計目的 3 三.設計思想說明 3 四.系統結構的說明 3 一 標頭檔案宣告 3 二 定義各種變數 3 三 訊號量的定義 3 ...