c语言cobegin用法,用C语言实现P、V操作
該樓層疑似違規(guī)已被系統(tǒng)折疊?隱藏此樓查看此樓
2.理發(fā)師問題:一個理發(fā)店有一個入口和一個出口。理發(fā)店內(nèi)有一個可站5 位顧客的站席
區(qū)、4 個單人沙發(fā)、3 個理發(fā)師及其專用理發(fā)工具、一個收銀臺。新來的顧客坐在沙發(fā)上等
待;沒有空沙發(fā)時(shí),可在站席區(qū)等待;站席區(qū)滿時(shí),只能在入口外等待。理發(fā)師可從事理
發(fā)、收銀和休息三種活動。理發(fā)店的活動滿足下列條件:
1)休息的理發(fā)師是坐地自己專用的理發(fā)椅上,不會占用顧客的沙發(fā);
2)處理休息狀態(tài)的理發(fā)師可為在沙發(fā)上等待時(shí)間最長的顧客理發(fā);
3)理發(fā)時(shí)間長短由理發(fā)師決定;
4)在站席區(qū)等待時(shí)間最長的顧客可坐到空閑的理發(fā)上;
5)任何時(shí)刻最多只能有一個理發(fā)師在收銀。
試用信號量機(jī)制或管程機(jī)制實(shí)現(xiàn)理發(fā)師進(jìn)程和顧客進(jìn)程。
原理:
(1)customer 進(jìn)程:
首先檢查站席區(qū)是否已滿(stand_capacity),若滿選擇離開,否則進(jìn)入站席區(qū),即進(jìn)入
理發(fā)店。在站席區(qū)等待沙發(fā)的空位(信號量sofa),如果沙發(fā)已滿,則進(jìn)入阻塞等待隊(duì)列,
直到出現(xiàn)空位,在站席區(qū)中等待時(shí)間最長的顧客離開站席區(qū)(stand_capacity)。坐到沙
發(fā)上,等待理發(fā)椅(barber_chair),如果理發(fā)椅已滿,則進(jìn)入阻塞等待隊(duì)列,直到出現(xiàn)
空位,在沙發(fā)上等待時(shí)間最長的顧客離開沙發(fā)(釋放信號量sofa)。坐到理發(fā)椅上,釋放
準(zhǔn)備好的信號(customer_ready),獲得該理發(fā)師的編號(0~1 的數(shù)字)。等待理發(fā)師理
發(fā)結(jié)束(finished[barber_number])。在離開理發(fā)椅之前付款(payment),等待收據(jù)
(receipt),離開理發(fā)椅(leave_barberchair)。最后離開理發(fā)店。
這里需要注意幾點(diǎn):
a) 首先是幾個需要進(jìn)行互斥處理的地方,主要包括:進(jìn)入站席區(qū)、進(jìn)入沙發(fā)、進(jìn)入理發(fā)椅
和付款幾個地方。
b) 通過barber_chair 保證一個理發(fā)椅上最多只有一名顧客。但這也不夠,因?yàn)閱螒{
baber_chair 無法保證一名顧客離開理發(fā)椅之前,另一位顧客不會坐到該理發(fā)椅上,
因此增加信號量leave_barberchair,讓顧客離開理發(fā)椅后,釋放該信號,而理發(fā)
師接收到該信號后才釋放barber_chair 等待下一位顧客。
c) 在理發(fā)的過程中,需要保證是自己理發(fā)完畢,才能夠進(jìn)行下面的付款、離開理發(fā)椅的活
動。這個機(jī)制是通過customer 進(jìn)程獲得給他理發(fā)的理發(fā)師編號來實(shí)現(xiàn)的,這樣,當(dāng)
該編號的理發(fā)師釋放對應(yīng)的finished[i]信號的時(shí)候,該顧客才理發(fā)完畢。
d) 理發(fā)師是通過mutex 信號量保證他們每個人同時(shí)只進(jìn)行一項(xiàng)操作(理發(fā)或者收款)。
e) 為了保證該顧客理發(fā)完畢后馬上可以付款離開,就應(yīng)該保證給該顧客理發(fā)的理發(fā)師在理
發(fā)完畢后馬上到收銀臺進(jìn)入收款操作而不是給下一位顧客服務(wù)。在偽碼中由以下機(jī)制實(shí)
現(xiàn):即顧客在釋放離開理發(fā)椅的信號前,發(fā)出付款的信號。這樣該理發(fā)師得不到顧客的
離開理發(fā)椅的信號,不能進(jìn)入下一個循環(huán)為下一名顧客服務(wù),而只能進(jìn)入收款臺的收款
操作。直到顧客接到收據(jù)后,才釋放離開理發(fā)椅的信號,離開理發(fā)椅,讓理發(fā)師釋放該
理發(fā)椅的信號,讓下一位等待的顧客坐到理發(fā)椅上。
(2)barber 進(jìn)程
首先將該理發(fā)師的編號壓入隊(duì)列,供顧客提取。等待顧客坐到理發(fā)椅坐好(信號量
customer_ready),開始理發(fā),理發(fā)結(jié)束后釋放結(jié)束信號(finished[i])。等待顧客
離開理發(fā)椅(leave_barberchair)(期間去收銀臺進(jìn)行收款活動),釋放理發(fā)椅空閑信
號(barber_chair),等待下一位顧客坐上來。
(3)cash(收銀臺)進(jìn)程
等待顧客付款(payment),執(zhí)行收款操作,收款操作結(jié)束,給付收據(jù)(receipt)。
信號量總表:
信號量 wait signal
stand_capacity 顧客等待進(jìn)入理發(fā)店 顧客離開站席區(qū)
sofa 顧客等待坐到沙發(fā) 顧客離開沙發(fā)
barber_chair 顧客等待空理發(fā)椅 理發(fā)師釋放空理發(fā)椅
customer_ready 理發(fā)師等待,直到一個顧客坐
到理發(fā)椅
顧客坐到理發(fā)椅上,給理發(fā)師
發(fā)出信號
mutex 等待理發(fā)師空閑,執(zhí)行理發(fā)或
收款操作
理發(fā)師執(zhí)行理發(fā)或收款結(jié)束,
進(jìn)入空閑狀態(tài)
mutex1 執(zhí)行入隊(duì)或出隊(duì)等待 入隊(duì)或出隊(duì)結(jié)束,釋放信號
finished[i] 顧客等待對應(yīng)編號理發(fā)師理
發(fā)結(jié)束
理發(fā)師理發(fā)結(jié)束,釋放信號
leave_barberchair 理發(fā)師等待顧客離開理發(fā)椅 顧客付款完畢得到收據(jù),離開
理發(fā)椅釋放信號
payment 收銀員等待顧客付款 顧客付款,發(fā)出信號
receipt 顧客等待收銀員收、開具收據(jù)收銀員收款結(jié)束、開具收據(jù),
釋放信號
總結(jié)
以上是生活随笔為你收集整理的c语言cobegin用法,用C语言实现P、V操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言样本,C语言样本教案 第二章
- 下一篇: android两个耳机能连两部手机吗,A