讀者
—寫者問題 讀者
—寫者問題(readers-writers problem
)也是乙個經典的併發程式設計問題,是經常出現的一種同步問題。計算機系統中的資料(檔案、記錄)常被多個程序共享,但其中某些程序可能只要求讀資料(稱為讀者
reader
);另一些程序則要求修改資料(稱為寫者
writer
)。就共享資料而言,
reader
和writer
是兩組併發程序共享一組資料區,要求:(1
)允許多個讀者同時執行讀操作;(2
)不允許讀者、寫者同時操作;(3
)不允許多個寫者同時操作。
reader
和writer
的同步問題分為讀者優先、弱寫者優先(公平競爭)和強寫者優先三種情況,它們的處理方式不同。
(
1)讀者優先。對於讀者優先,應滿足下列條件:
如果新讀者到:
①無讀者、寫者,新讀者可以讀;
②有寫者等待,但有其它讀者正在讀,則新讀者也可以讀;
③有寫者寫,新讀者等待。
如果新寫者到:
①無讀者,新寫者可以寫;
②有讀者,新寫者等待;
③有其它寫者,新寫者等待。
單純使用訊號量不能解決讀者與寫者問題,必須引入計數器
rc對讀程序計數;
rc_mutex
是用於對計數器
rc操作的互斥訊號量;
write
表示是否允許寫的訊號量;於是讀者優先的程式設計如下:
int rc=0;
//用於記錄當前的讀者數量
semaphore rc_mutex=1;
//用於對共享變數
rc操作的互斥訊號量
semaphore write=1;
//用於保證讀者和寫者互斥地訪問的訊號量
void reader()
do while(1)
void writer()
do while(1)
讀者優先的設計思想是
讀程序只要看到有其它讀程序正在讀,就可以繼續進行讀;寫程序必須等待所有讀程序都不讀時才能寫,即使寫程序可能比一些讀程序更早提出申請。該演算法
只要還有乙個讀者在活動,就允許後續的讀者進來,該策略的結果是,如果有乙個穩定的讀者流存在,那麼這些讀者將在到達後被允許進入。而寫者就始終被掛起,直到沒有讀者為止。
(
2)寫者優先
1。為了解決以上問題,
寫者優先
1的設計思想是
在乙個寫者到達時如果有正在工作的讀者,那麼該寫者只要等待正在工作的讀者完成,而不必等候其後面到來的讀者就可以進行寫操作。注意,
該演算法當乙個寫者在等待時,後到達的讀者是在寫者之後被掛起,而不是立即允許進入。
在讀者優先的演算法的基礎上增加了乙個排隊訊號量
read
,讀、寫程序在每次操作前都要等待
read
訊號量。
寫者優先
1的程式設計如下:
int rc=0;
//用於記錄當前的讀者數量
semaphore rc_mutex=1;
//用於對共享變數
rc操作的互斥訊號量
semaphore wc_mutex=1;
//用於保證讀者和寫者互斥地訪問的訊號量
semaphore write=1;
//用於保證讀者和寫者互斥地訪問的訊號量
semaphore read=1;
//用於保證在寫程序封鎖其後續的讀程序的訊號量
void reader() do
void writer() do}
void writer()
} 這裡write_first的設立是為了保證寫者優先。因為write_first的初值是1,在讀程序,執行完p(write_first)後等在p(read)這一句的讀者最多只有1個。
對於read訊號量,
每個讀程序最開始都要申請一次,之後在真正做讀操作前即讓出,這使得寫程序可以隨時申請到
read
。而寫程序,只有第乙個寫程序需要申請
read
,之後就一直佔著不放了,直到所有寫程序都完成後才讓出。等於只要有寫程序提出申請就禁止讀程序在
read
訊號量上
排隊。假設乙個寫程序正在寫時,接著後續有
n個讀者正在等待,這時又有乙個新的寫者要寫,比較一下寫者優先
1和寫者優先
2的情況:寫者優先
1新來的寫者需要等待
n+1次v(
read
)操作,而寫者優先
2新來的寫者只需等待2次
v(read
)操作,變相提高了寫程序的優先順序。
讀者寫者問題
生產者消費者問題一樣,讀者寫者也是乙個非常著名的同步問題。讀者寫者問題描述非常簡單,有乙個寫者很多讀者,多個讀者可以同時讀檔案,但寫者在寫檔案時不允許有讀者在讀檔案,同樣有讀者在讀檔案時寫者也不去能寫檔案。上面是讀者寫者問題示意圖,類似於生產者消費者問題的分析過程,首先來找找哪些是屬於 等待 情況。...
讀者寫者問題
問題簡述 讀者 寫者問題的讀寫操作限制 包括讀者優先和寫者優先 1 寫 寫互斥,即不能有兩個寫者同時進行寫操作。2 讀 寫互斥,即不能同時有乙個執行緒在讀,而另乙個執行緒在寫。3 讀 讀允許,即可以有乙個或多個讀者在讀。讀者優先的附加限制 如果乙個讀者申請進行讀操作時已有另乙個讀者正在進行讀操作,則...
讀者 寫者問題
讀者 寫者問題 讀者 寫者問題 readers writers problem 也是乙個經典的併發程式設計問題,是經常出現的一種同步問題。計算機系統中的資料 檔案 記錄 常被多個程序共享,但其中某些程序可能只要求讀資料 稱為讀者 reader 另一些程序則要求修改資料 稱為寫者 writer 就共享...