1. 程式人生 > >程序同步與互斥之經典問題二

程序同步與互斥之經典問題二

讀者/寫者問題

問題描述:

有兩組併發程序:讀者和寫者,共享一組資料區
要求:

  • 允許多個讀者同時進行讀操作
  • 不允許讀者、寫著同時進行操作
  • 不允許多個寫著同時進行操作

解答如下:
設定兩個訊號量並賦初值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) }

請大家細細品味,這兩個解法有什麼區別?
如果大家看懂了訊號量實現程序同步和互斥,那應該能看出其中的不同。

在下一篇部落格中,我會繼續講同步與互斥經典問題三——哲學家就餐問題