讀寫者問題

2021-10-02 06:30:38 字數 1627 閱讀 1390

只要求讀檔案的程序稱為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種角色,當然模型中肯定需要乙個儲存資料的場所,能夠將生產者生產的資料進行儲存。同時,模型必須要滿足生產者產生出資料後,消費者才能夠進行使用,即就是消費者必須位於生產者之後,當然生產者生產的資料最多將場所放置...