程序同步與互斥之經典問題二
阿新 • • 發佈:2019-02-09
讀者/寫者問題
問題描述:
有兩組併發程序:讀者和寫者,共享一組資料區
要求:
- 允許多個讀者同時進行讀操作
- 不允許讀者、寫著同時進行操作
- 不允許多個寫著同時進行操作
解答如下:
設定兩個訊號量並賦初值mutex=1和w=1
設定一個全域性變數readcount=0,表示當前有幾個讀者在讀
mutex作用:讀者與讀者之間實現互斥,不允許多個讀者程序同時修改readcount
w作用:實現讀者與寫者、寫者與寫者之間的互斥
程式碼如下(如有不懂,可以在下面留言,一起交流):
read{
P(mutex)
readcount++
if(readcount==1 ) P(w)
V(mutex)
讀操作
P(mutex)
readcount--
if(readcount==0) V(w)
V(mutex)
}
write{
P(w)
寫操作
V(w)
}
第二種解答如下:
新增一個訊號量並賦初值S=1
read{
P(S)
P(mutex)
readcount++
if(readcount==1) P(W)
V(mutex)
V(S)
讀操作
P(mutex)
readcount--
if(readcount==0 ) V(S)
V(mutex)
}
write{
P(S)
P(W)
寫操作
V(W)
V(S)
}
請大家細細品味,這兩個解法有什麼區別?
如果大家看懂了訊號量實現程序同步和互斥,那應該能看出其中的不同。
在下一篇部落格中,我會繼續講同步與互斥經典問題三——哲學家就餐問題