讀者 寫者問題

2021-09-05 23:41:31 字數 2089 閱讀 3269

乙個資料檔案或記錄,可被多個程序共享,我們把只要求讀該檔案的程序稱為「讀者程序」,其他程序稱為「寫者程序」。讀者-寫者問題的描述為:

1、允許多個讀者程序同時讀乙個共享檔案,因為讀操作不會使資料檔案混亂;(可以同時讀)

2、不允許乙個寫者程序和其他讀者程序同時訪問共享檔案,因為這種訪問將會引起混亂; (讀寫不能同時)

3、不允許兩個或兩個以上寫者程序同時訪問共享檔案,因為這種訪問將會引起混亂。(最多只能乙個寫)

所以,讀者——寫者問題實質上就是指保證乙個writer程序必須與其它程序互斥地訪問共享物件的同步問題。

演算法分析:

為實現reader程序和writer程序間的互斥,設定乙個互斥訊號量wmutex,其初值為1;

設定乙個整型變數rcounter,記錄正在讀的讀者程序數。其初值為0; (因為要等讀者全部退出才能進行寫者操作,所以需要記錄讀者的數量)

由於只要有乙個reader程序在讀,便不允許writer程序去寫,因此第乙個讀者程序需要執行wait(wmutex)操作,即當rcounter =0時,reader程序才需要執行wait(wmutex)操作。若wait(wmutex)操作成功(表示此時無writer程序在寫),reader程序便可去讀,同時做rcounter+1的操作。

同理,最後乙個讀程序reader離開時,亦即計數變數rcounter-1後變為0時,應執行signal(wmutex)操作,以便讓writer程序寫。

rcounter是被多個reader程序訪問的臨界資源,為了對它互斥訪問,應為它設定乙個互斥訊號量rmutex。

1、讀者優先演算法

semaphore rmutex=1,wmutex=1;

int readcount=0;

void reader()while(true);

}void writer()while(true)

}void main()

【分析】

▲當第乙個讀者在讀檔案時,後續讀者也可進入臨界區讀該檔案,後續寫者不能寫(在wmutex上阻塞);待所有讀者退出時,由最後退出的讀者喚醒乙個寫者。

▲當有乙個寫者在寫時,後續寫者不能寫,在wmutex上阻塞;後續讀者不能讀,其中第乙個讀者在wmutex上阻塞(當寫者在寫時,wmutex=0,此時讀者進來後,wmutex=-1,wait(wmutex)阻塞,則第乙個讀者阻塞在這裡,rmutex訊號量被占用,無法被釋放,則之後的讀者也無法進來),其餘讀者在rmutex上阻塞。該寫者退出時,喚醒乙個寫者或讀者。

上述演算法實際上是「優先讀者」演算法,當有讀者正在讀,且後續讀者源源不斷到來時,寫者將長期得不到服務。寫者「餓死」。

為此,可以考慮「優先寫者」的演算法——當有寫者要寫時,待目前正在讀的讀者讀完後,立即讓寫者去寫(即一旦有寫者到達,後續的讀者都必須等待,而無論是否有讀者在讀檔案)。

可以增加乙個互斥訊號量w,用於在寫程序到達時封鎖後續的讀者程序:

讀者程序進入時訪問rcounter時,增加執行wait(w)和signal(w);寫者進入臨界區時,增加執行wait(w)和signal(w)。

(相當於只有1個資源被讀者和寫者共享)

2、寫者優先。

semaphore rmutex,wmutex,w;//rmutex是為了reader互斥訪問rcount,wmutex是為了writer互斥訪問wcount,w是為了reader和writer互斥訪問臨界區

int rcount,wcount;//增加寫者計數器,在讀者wcount!=0時,不能進行read操作。實現寫者優先。

rmutex=1,wmutex=1,w=1;

rcount=0,wcount=0;

void reader()

}void writer()

}

rcount和wcount這個訊號量,就是為了實現優先才設定出來的。不論是讀還是寫,在執行操作時,其本身的rmutex(/wmutex)已經釋放出來,因此可以繼續讓reader/(writer)進入,並且count加1,實現在count不等於0的情況下,無限迴圈的執行 reader(/writer)進入——count++——操作——count-- 的操作,直到沒有新的reader(/writer)進入,count=0為止,才允許writer(/reader)程序進入進行操作。

讀者寫者問題

生產者消費者問題一樣,讀者寫者也是乙個非常著名的同步問題。讀者寫者問題描述非常簡單,有乙個寫者很多讀者,多個讀者可以同時讀檔案,但寫者在寫檔案時不允許有讀者在讀檔案,同樣有讀者在讀檔案時寫者也不去能寫檔案。上面是讀者寫者問題示意圖,類似於生產者消費者問題的分析過程,首先來找找哪些是屬於 等待 情況。...

讀者寫者問題

問題簡述 讀者 寫者問題的讀寫操作限制 包括讀者優先和寫者優先 1 寫 寫互斥,即不能有兩個寫者同時進行寫操作。2 讀 寫互斥,即不能同時有乙個執行緒在讀,而另乙個執行緒在寫。3 讀 讀允許,即可以有乙個或多個讀者在讀。讀者優先的附加限制 如果乙個讀者申請進行讀操作時已有另乙個讀者正在進行讀操作,則...

讀者 寫者問題

讀者 寫者問題 讀者 寫者問題 readers writers problem 也是乙個經典的併發程式設計問題,是經常出現的一種同步問題。計算機系統中的資料 檔案 記錄 常被多個程序共享,但其中某些程序可能只要求讀資料 稱為讀者 reader 另一些程序則要求修改資料 稱為寫者 writer 就共享...