讀者 寫者問題

2021-07-30 02:48:51 字數 1584 閱讀 9880

有讀者和寫者兩組併發程序,共享乙個檔案,當兩個或以上的讀程序同時訪問共享資料時不會產生***,但若某個寫程序和其他程序(讀程序或寫程序)同時訪問共享資料時則可能導致資料不一致的錯誤。因此要求:①允許多個讀者可以同時對檔案執行讀操作;②只允許乙個寫者往檔案中寫資訊;③任一寫者在完成寫操作之前不允許其他讀者或寫者工作;④寫者執行寫操作前,應讓已有的讀者和寫者全部退出。1) 關係分析。由題目分析讀者和寫者是互斥的,寫者和寫者也是互斥的,而讀者和讀者不存在互斥問題。

2) 整理思路。兩個程序,即讀者和寫者。寫者是比較簡單的,它和任何程序互斥,用互斥訊號量的p操作、v操作即可解決。讀者的問題比較複雜,它必須實現與寫者互斥的同時還要實現與其他讀者的同步,因此,僅僅簡單的一對p操作、v操作是無法解決的。那麼,在這裡用到了乙個計數器,用它來判斷當前是否有讀者讀檔案。當有讀者的時候寫者是無法寫檔案的,此時讀者會一直占用檔案,當沒有讀者的時候寫者才可以寫檔案。同時這裡不同讀者對計數器的訪問也應該是互斥的。

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

1. int count=0; //

用於記錄當前的讀者數量

2. semaphore mutex=1; //

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

3. semaphore rw=1; //

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

4. writer ()

10. }

11. reader ()

25. }

在上面的演算法中,讀程序是優先的,也就是說,當存在讀程序時,寫操作將被延遲,並且只要有乙個讀程序活躍,隨後而來的讀程序都將被允許訪問檔案。這樣的方式下,會導致寫程序可能長時間等待,且存在寫程序「餓死」的情況。

如果希望寫程序優先,即當有讀程序正在讀共享檔案時,有寫程序請求訪問,這時應禁止後續讀程序的請求,等待到已在共享檔案的讀程序執行完畢則立即讓寫程序執行,只有在無寫程序執行的情況下才允許讀程序再次執行。為此,增加乙個訊號量並且在上面的程式中 writer()和reader()函式中各增加一對pv操作,就可以得到寫程序優先的解決程式。

int count = 0; //

用於記錄當前的讀者數量

semaphore mutex = 1; //

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

semaphore rw=1; //

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

semaphore w=1; //

用於實現「寫優先」

writer()

}reader ()

}

就共享資料而言,

reader

和writer

是兩組併發程序共享一組資料區,要求:(1

)允許多個讀者同時執行讀操作;(2

)不允許讀者、寫者同時操作;(3

)不允許多個寫者同時操作。

reader

和writer

的同步問題分為讀者優先、弱寫者優先(公平競爭)和強寫者優先三種情況,它們的處理方式不同。

另附一篇好文章:

讀者寫者問題

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

讀者寫者問題

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

讀者 寫者問題

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