接上篇的訊號量經典例題,其中包括“讀者寫者”,“過獨木橋”,“公交車”,“四方戀愛”等
一. 讀者寫著問題(這裡有很多種情況):
(1)讀者優先
題目描述:有一本書,有多個讀者和寫者,讀寫互斥,寫寫互斥。當多個讀者可以同時讀,即當有讀者在讀這本書時,其他的讀者也可以進來讀,但寫者就不能進來寫。
解答:
訊號量:
w:可寫否:1
nReader:讀者數 :0
mutex:讀者之間的“互斥”,進出的先後順序而已:1
寫者: 讀者
P(w) P(mutex)
寫 nReader ++
V(w) if(nReader == 1)//第一個讀者
P(w) //堵塞寫者
V(mutex)
讀
P(mutex)
nReader - -
if(nReader==0)//最後一個讀者
V(w) //喚醒寫者
V(mutex)
(2)寫者優先
題目描述:有一本書,有多個讀者和寫者,讀寫互斥,寫寫互斥,不同的是只要有寫者等,後續讀者必須等待在寫者後面
w:可寫否:1
nReader:讀者數 :0
mutex:讀者之間的“互斥”,進出的先後順序而已:1
s:用於封鎖後續讀者 :1
寫者: 讀者
P(s)
P(s) P(mutex)
P(w) nReader ++
寫 if(nReader == 1)//第一個讀者
V(w) P(w) //堵塞寫者
V(s) V(mutex)
V(s)
讀
P(mutex)
nReader - -
if(nReader==0)//最後一個讀者
V(w) //喚醒寫者
V(mutex)
二.過獨木橋
題目描述:
橋單向通行,分別從西到東和從東到西
解答:
訊號量:
s : 表示橋可用。 :1
nw : 東向西人數 :0
ne : 西向東人數 : 0
m1: 互斥對nw的修改 :1
m2: 互斥對ne的修改 :1
ToWest ToEast
P(m1) P(m2)
nw++ ne ++
if(1==nw) if(1==ne)
P(s) P(s)
V(m1) V(m2)
cross the bridge to west cross the bridge to east
P(m1) P(m2)
nw-- ne - -
if(0==nw) if(0==ne)
V(s) V(s)
V(m1) V(m2)
三.四方戀愛
題目描述:有兩男兩女,男士送女士玫瑰,女士送男士手錶。一一對應,每個只能串連一個
解答:
(1)老師答案
訊號量:
m1:互斥女士之間的收花送表行為:1
m2:互斥男士之間的收表送花行為:1
s1:有花。 0
s2:有表。 0
女士 男士
P(s1) P(m2)
P(m1) 送花
收花 V(s1)
送表 P(s2)
V(s2) 手錶
V(m1) V(m2)
戀愛 戀愛
(2)自己的答案
四個分別是李四(男),張三(男),嘻嘻(女),哈哈(女)
訊號量:
g1:是否有表收 :0
g2:是否有玫瑰收:0
s1:是否可以送表:1
s2:是否可以送玫瑰:1
note:這裡只運行一次的,不能夠迴圈
李四 張三 嘻嘻 哈哈
P(s2) P(s2) P(s1) P(s1)
sendRose() sendRose sendWatch sendWath
V(g2) V(g2) V(g1) V(g1)
P(g1) P(g1) P(g2) P(g2)
getWatch getWatch getRose getRose
V(s1) V(s1) V(s2) V(s2)
ps:這個解答我邏輯上想了一下,沒有錯誤,但我一個同學說實際上傳機器上跑時好像有問題,自己就沒想明白,請高手指教了