只要求讀檔案的程序稱為reader程序,其他程序稱為writer程序。
允許多個程序同時讀乙個共享物件,但不允許乙個writer程序和其他reader程序同時或writer程序同時訪問乙個共享物件。
簡單來說,讀寫者問題是保證乙個writer程序必須與其他程序互斥的訪問共享物件的同步問題。
三句話來說,就是:
讀讀共享;寫寫互斥;讀寫互斥
讀者-寫者問題是乙個經典的併發程式設計問題,是經常出現的乙個同步問題。
如果讀者來:
無讀者、寫者,新讀者可以讀
有寫者等待,但有其他讀者正在讀,新讀者可以讀
有寫者寫,新讀者等
如果寫者來:
無讀者,新寫者可以寫
有讀者,新寫者等待
有其他寫者,新寫者等待
現在開始分析讀寫者的
讀程序優先**
無需修改就可用於多個讀程序和寫程序的情況。寫程序非常簡單,訊號量用於實施互斥,只要乙個寫程序正在訪問共享資料區,其他的寫程序和讀程序都不能訪問它。讀程序也使用訊號量實施互斥,但是,為允許多個讀程序,當沒有讀程序正在讀時,第-乙個試圖讀的讀程序需要在訊號量上等待。當至少已經有乙個讀程序在讀時,隨後的讀程序無需等待,可以直接進入。全域性變數count用於記錄讀程序的數目,訊號量mutex用於確保count被正確地更新。
int count=0;
//用於記錄當前的讀者數量
semaphore mutex=1;
//用於保護更新count變數時的互斥
semaphore rw=1;
//用於保證讀者和寫者互斥地訪問檔案
writer ()}
reader (
)}
寫程序優先在前面的解決方案中,讀程序具有優先權。當乙個讀程序開始訪問資料區時,只要至少有-個讀程序正在讀,就為讀程序保留對這個資料區的控制權,因此,寫程序有可能處於飢餓狀態。以下方案保證當乙個寫程序宣告想寫時,不允許新的讀程序訪問該資料區。對於寫程序,在已有定義的基礎上還必須增加下列訊號量和變數:
int count =0;
//用於記錄當前的讀者數量
semaphore mutex =1;
//用於保護更新count變數時的互斥
semaphore rw=1;
//用於保證讀者和寫者互斥地訪問檔案
semaphore w=1;
//用於實現「寫優先」
writer()
} reader (
)}
讀者優先和寫者優先之間的區別在於:寫者提出了訪問共資料區的要求之後,是否允許新的讀者繼續進入,若允許就是讀者優先,若是不允許, 就是寫者優先。
在讀者優先的情況下,寫者可會挨餓,如果後續讀者源源不斷地進入。在寫者優先的情況下,讀者可能挨餓,如果有新的寫者不斷地提出新的要求。
多執行緒 讀寫者問題
秒殺多執行緒第十篇 生產者消費者問題 的生產者消費者問題一樣,讀者寫者也是乙個非常著名的同步問題。讀者寫者問題描述非常簡單,有乙個寫者很多讀者,多個讀者可以同時讀檔案,但寫者在寫檔案時不允許有讀者在讀檔案,同樣有讀者在讀檔案時寫者也不去能寫檔案。上面是讀者寫者問題示意圖,類似於生產者消費者問題 的分...
讀者寫者問題(讀者優先,寫者優先 ,讀寫公平)
讀者優先的解決方案 互斥訊號量wrt,初值是1,代表乙個共享檔案,解決 讀 寫 互斥,寫 寫 互斥。乙個記數器,即整型變數readcount,記錄讀者數,初值是0。來乙個讀者,readcount加1 當readcount 1表示是第乙個讀者,則需要執行p操作搶占檔案 否則表示已有讀者在安全的讀資料。...
生產者 消費者 模型與 讀 寫者 模型
生產者 消費者模型 首先,我們先分析一下生產者與消費者模型 生產者與消費者是模型中不可缺少的2種角色,當然模型中肯定需要乙個儲存資料的場所,能夠將生產者生產的資料進行儲存。同時,模型必須要滿足生產者產生出資料後,消費者才能夠進行使用,即就是消費者必須位於生產者之後,當然生產者生產的資料最多將場所放置...