參考
在之前的解決方案中,會存在乙個問題: 作者可能會餓死。
如果寫者到達的時候,臨界區中有讀者,那麼當讀者來來往往時,它可能會在佇列中等待。只要新讀者在最後一位讀者離開之前到達,房間裡總會有至少一位讀者。
這種情況不是僵局,因為一些執行緒正在取得進展,但這並不是完全可取的。只要系統上的負載很低,這樣的程式就可以工作,因為這樣寫者就有很多機會。但隨著負載的增加,系統的行為會迅速惡化(至少從寫者的角度來看)。
思考:擴充套件此解決方案,以便在寫者到達時,現有讀者可以完成,但不能再進入其他讀者。
不會餓死的讀者:
可以為讀者新增乙個旋轉門,並允許寫者鎖定它。 寫者必須通過相同的旋轉門,但是當他們在旋轉門內時,他們應該檢查roomempty訊號量。 如果寫者卡在旋轉門中,它會強迫讀者在旋轉門處排隊。 然後,當最後乙個讀者離開臨界區時,我們保證接下來至少有乙個寫者可以進入(在任何排隊的讀者進入之前)。
readswitch記錄房間裡有多少讀者; 當第乙個讀者進入時會鎖定roomempty;並在最後乙個讀者退出時將其解鎖。
turnstile對於讀者來說是乙個旋轉門,對於寫者來說是乙個互斥體。
ossemaphoreid_t sem_rootempty;
sem_rootempty =
ossemaphorenew(1
,1,null);
ossemaphoreid_t sem_turnstile;
sem_turnstile =
ossemaphorenew(1
,1,null);
lightswitch readswitch;
init_light
(&readswitch)
;readswitch.
init
(&readswitch)
;
寫者執行緒:
如果寫者到達時,房間裡已有讀者,它將阻塞在第2行,這意味著旋轉門將被鎖定。 這將阻止新的讀者進入,因為已經有寫者在排隊了。
while(1
)}ossemaphorerelease
(sem_turnstile)
;ossemaphorerelease
(sem_rootempty)
;}
讀者執行緒:
當最後乙個讀者離開時,它發出roomempty訊號,解鎖等待的寫者。寫者立即進入它的臨界區,因為沒有乙個等待的讀者可以通過旋轉門。
當寫者退出時,它會發出turnstile訊號,它可以解鎖等待的執行緒,這可能是讀者或寫者。 因此,這個解決方案保證至少有乙個寫者可以繼續,但是當有寫者在排隊時,讀者仍然有可能進入。
while(1
) readswitch.
unlock
(&readswitch, sem_rootempty)
;}
讀者寫者問題
生產者消費者問題一樣,讀者寫者也是乙個非常著名的同步問題。讀者寫者問題描述非常簡單,有乙個寫者很多讀者,多個讀者可以同時讀檔案,但寫者在寫檔案時不允許有讀者在讀檔案,同樣有讀者在讀檔案時寫者也不去能寫檔案。上面是讀者寫者問題示意圖,類似於生產者消費者問題的分析過程,首先來找找哪些是屬於 等待 情況。...
讀者寫者問題
問題簡述 讀者 寫者問題的讀寫操作限制 包括讀者優先和寫者優先 1 寫 寫互斥,即不能有兩個寫者同時進行寫操作。2 讀 寫互斥,即不能同時有乙個執行緒在讀,而另乙個執行緒在寫。3 讀 讀允許,即可以有乙個或多個讀者在讀。讀者優先的附加限制 如果乙個讀者申請進行讀操作時已有另乙個讀者正在進行讀操作,則...
讀者 寫者問題
讀者 寫者問題 讀者 寫者問題 readers writers problem 也是乙個經典的併發程式設計問題,是經常出現的一種同步問題。計算機系統中的資料 檔案 記錄 常被多個程序共享,但其中某些程序可能只要求讀資料 稱為讀者 reader 另一些程序則要求修改資料 稱為寫者 writer 就共享...