讀者 寫者問題

2021-07-13 22:14:18 字數 2467 閱讀 2586

讀者

—寫者問題 讀者

—寫者問題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 讀 讀允許,即可以有乙個或多個讀者在讀。讀者優先的附加限制 如果乙個讀者申請進行讀操作時已有另乙個讀者正在進行讀操作,則...

讀者 寫者問題

有讀者和寫者兩組併發程序,共享乙個檔案,當兩個或以上的讀程序同時訪問共享資料時不會產生 但若某個寫程序和其他程序 讀程序或寫程序 同時訪問共享資料時則可能導致資料不一致的錯誤。因此要求 允許多個讀者可以同時對檔案執行讀操作 只允許乙個寫者往檔案中寫資訊 任一寫者在完成寫操作之前不允許其他讀者或寫者工...