經典程序同步問題 讀者寫者

2021-10-10 10:14:12 字數 1409 閱讀 9997

讀者-寫者問題

問題描述:有讀者和寫者兩組併發程序,共享乙個檔案,當兩個或以上的讀程序同時訪問共享資料時不會產生***,但是如果某個寫程序和其他程序(讀程序或寫程序)同時訪問共享資料時則可能導致資料不一致的錯誤。簡單來說,你可以乙個文件開啟好多,但是你不能邊讀邊寫。從上述來看,得滿足以下幾個要求。

①允許多個讀者可以同時對檔案執行讀操作;

②只允許乙個寫著往檔案中寫資訊。

③任一寫著再完成寫操作前不允許或其他讀者或寫者工作;

④寫者執行寫操作前,應讓已有的讀者和寫著全部退出。

問題分析

關係分析。可以看出讀者和寫者是互斥,寫者和寫者也是互斥,讀者和讀者不存在互斥。

整理思路。兩個程序,讀者和寫著。寫者比較容易實現,它和任何程序互斥,用互斥訊號量p和v可以解決。讀者比較複雜,它必須在實現與寫者互斥的同時,實現與其他讀者同步,因此一對p和v是無法解決問題的。這裡用到了乙個計數器count,用它來判斷是否由讀者讀檔案。當有讀者時,寫者無法寫檔案,當沒有讀者時,寫者才可以寫檔案。同時,這裡不會讀者對計數器的訪問也應該是互斥的。

訊號量設定。count計數器,用於記錄當前讀者的數量,初始值為0;設定mutex為互斥訊號量,用於保護更新count變數時的互斥;設定互斥訊號量rw,用於保證讀者和寫者的互斥訪問。

**描述如下:

int

count=0;

//用於記錄當前的讀者數量

semaphore mutex=1;

//用於保護更新count變數時的互斥

semaphore rw=1;

//用於保證 讀者和寫者互斥地訪問檔案

writer()  

}  reader()  

}  從上述可以看出,讀程序是優先的,只有出現了讀程序,那麼寫操作就會被延遲,且只要有乙個讀程序活躍,那麼它後面的都允許訪問檔案。這樣會讓寫程序一直等待,會出現餓死的情況。如果要寫程序優先的話,只要在讀寫程序上增加一對pv操作即可,**描述如下,黑色加粗為增加的地方。

int

count=0;

//用於記錄當前的讀者數量

semaphore mutex=1;

//用於保護更新count變數時的互斥

semaphore rw=1;

//用於保證 讀者和寫者互斥地訪問檔案

semaphore w=1;

//用於實現「寫優先」

writer()  

}  reader()  

}其實這裡的寫優先是相對的,並不是真正的寫程序優先,有些書上,也把這個演算法成為讀寫公平法,它只是不會讓寫程序「餓死」。

經典程序同步問題 讀者寫者問題

問題描述 有讀者和寫者兩組併發程序,共享乙個檔案,當兩個或以上的讀程序同時訪問共享資料時不會產生 但若某個寫程序和其他程序 讀程序或寫程序 同時訪問共享資料時則可能導致資料不一致的錯誤。因此要求 允許多個讀者可以同時對檔案執行讀操作 只允許乙個寫者往檔案中寫資訊 任一寫者在完成寫操作之前不允許其他讀...

讀者和寫者問題 程序同步

出處 http dantvt.spaces.live.com 讀者 寫者問題 寫者優先與公平競爭 多程序對共享資源互斥訪問及程序同步的經典問題 設有一檔案f,多個併發讀程序和寫程序都要訪問,要求 1 讀寫互斥 2 寫寫互斥 3 允許多個讀程序同時訪問 採用記錄型訊號量機制解決 較常見的寫法 sema...

程序同步 讀者與寫者的問題

writer1 writer2 reader1 count v mutex 讀 p mutex count if count 0 如果是最後乙個讀者,釋放檔案 v mutex reader2 count v mutex 讀 p mutex count if count 0 v mutex 例 橫跨峽...