我遇到了野蠻人用餐的問題和解決方案,但我似乎不明白解決方案是如何處理野蠻人試圖在鍋里還空著的情況下從鍋里吃東西的。來自信號量小書的問題和解決方案:
一個野蠻人部落用一個大鍋吃公共晚餐,這個鍋可以裝 M 份燉傳教士。當一個野蠻人想吃東西時,他會從鍋里自己端出來,除非鍋是空的。如果鍋是空的,野蠻人會叫醒廚師,然后等待廚師重新裝滿鍋。任意數量的野蠻執行緒運行以下未同步的野蠻代碼:
while True :
getServingFromPot()
eat()
一個廚師執行緒運行這個非同步的廚師代碼:
while True:
putServingsInPot(M)
同步約束是:
- 如果鍋是空的,Savages 無法呼叫 getServingFromPot。
- 只有當鍋是空的時,廚師才能呼叫 putServingsInPot。
謎題:為滿足同步的野人和廚師添加代碼
解決方案(廚師):
while True:
emptyPot.wait()
putServingsInPot(M)
fullPot.signal()
解決方案(野蠻人):
while True:
mutex.wait()
if servings == 0:
emptyPot.signal ()
fullPot.wait ()
servings = M
servings -= 1
getServingFromPot ()
mutex.signal()
eat()
我的問題 - 當我們第一次到達時servings = 0,在 M 個野蠻人從鍋里吃完之后,我們到達emptyPot.signal()然后fullPot.wait()- 兩個信號量;然后,從我的角度來看,可能會有一個角落案例,我們可能會getServingsFromPot在廚師有機會獲得背景關系并裝滿鍋之前進行處理。我錯過了什么嗎?
uj5u.com熱心網友回復:
我假設signal和wait是通常的V和P信號操作。
我認為您可能會錯過每個信號量的重點。
emptyPot:除非野蠻人表示鍋已空,否則廚師不會裝滿鍋;fullPot:發出鍋已空信號的野蠻人將不會得到一份食物,除非廚師發出信號表示鍋已滿;mutex: 一個想吃飯的野蠻人不會繼續,除非另一個野蠻人表示他們已經吃完了。
所以:
- 多個野蠻人可以同時進食;
- 沒有兩個野蠻人會試圖同時為自己服務;
- 如果鍋是空的,野蠻人不會試圖為自己服務;
- 喚醒廚師后,除非鍋已滿,否則野蠻人不會嘗試自己端菜。
因此,不可能有競爭條件。由于呼叫fullPot.wait(),野蠻人無法到達,getServingsFromPot直到廚師醒來,裝滿鍋并呼叫fullPot.signal()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/400304.html
下一篇:如何使用C語言顯示組合四叉樹?
