讀者優先的解決方案:
互斥訊號量wrt,初值是1,代表乙個共享檔案,解決「讀-寫」互斥,「寫-寫」互斥。
乙個記數器,即整型變數readcount,記錄讀者數,初值是0。 來乙個讀者, readcount加1 當readcount =1表示是第乙個讀者, 則需要執行p操作搶占檔案;否則表示已有讀者在安全的讀資料。 走乙個讀者,readcount減1 當readcount =0表示是最後乙個讀者,則需要v操作釋放資源;否則表示還有讀者在讀資料。
readcount 為多個讀者共享的變數,是臨界資源。用互斥訊號量mutex控制, mutex初值是1。
**:
int readcount=0;
semaphore mutex=1, wrt=1 ;
讀者程序:
wait (mutex);
readcount++;
if (readcount == 1)
wait(wrt);
signal (mutex);
… reading is performed
…wait (mutex);
readcount--;
if (readcount == 0)
signal (wrt);
signal (mutex);
寫者程序:
wait(wrt);
…writing is performed
…signal(wrt);
解決方案:
在讀者優先的基礎上
增加訊號量r,初值是1:當至少有乙個寫程序準備訪問資料區時,用於禁止所有的讀程序。
增加乙個記數器,即整型變數writecount,記錄寫者數,初值是0。 writecount為多個寫者共享的變數,是臨界資源。用互斥訊號量mutex2控制, mutex2初值是1。
增加mutex3,初值是1:在r上不允許建造長佇列,否則寫程序將不能跳過這個佇列,因此,只允許乙個讀程序在r上排隊,而所有其他讀程序在等待r之前,在訊號量mutex3上排隊。
**:
int readcount=0, writecount=0;
semaphore mutex1=1, mutex2=1, mutex3=1, w=1, r=1 ;
讀者程序:
p(mutex 3);
p(r);
p(mutex 1);
readcount++;
if (readcount == 1 )
p(w);
v(mutex 1);
v(r);
v(mutex 3);
reading is performed
p(mutex 1);
readcount --;
if (readcount == 0 )
v(w);
v(mutex 1);
寫者程序:
p(mutex 2);
writecount++;
if (writecount == 1 )
p(r);
v(mutex 2);
p(w);
writing is performed
v(w);
p(mutex 2);
writecount --;
if (writecount == 0)
v(r);
v(mutex 2);
**:
int readcount=0;
semaphore mutex=1, rw=1 w=1;
讀者程序:
wait (w);
wait (mutex);
if (readcount == 0)
wait(rw);
readcount++;
signal (mutex);
signal (w);
… reading is performed
…wait (mutex);
readcount--;
if (readcount == 0)
signal (rw);
signal (mutex);
寫者程序:
wait(w);
wait(rw);
…writing is performed
…signal(rw);
signal(w);
讀者寫者問題(讀者優先 寫者優先 公平競爭)
讀者優先 1.寫者 讀者互斥訪問檔案資源。2.多個讀者可以同時訪問檔案資源。3.只允許乙個寫者訪問檔案資源。具體實現 1.設定訊號量filesrc實現讀寫者對臨界資源的訪問。2.設定計數器readcount來統計訪問臨界資源的讀者數目,設定訊號量readcountsignal完成對readcount...
經典排程問題 讀者優先 寫者優先演算法
建立乙個包含n 個執行緒的控制台程序。用這n 個執行緒來表示n個讀者或寫者。每個執行緒按相應測試資料檔案的要求,進行讀寫操作。請用訊號量機制分別實現讀者優先和寫者優先的讀者 寫者問題。讀者優先 如果乙個讀者申請進行讀操作時已有另一讀者正在進行讀操作,則該讀者可直接開始讀操作。寫者優先 如果乙個讀者申...
讀者寫者問題 讀者優先 python測試)
總結乙個資料物件若被多個併發程序所共享,且其中一些程序只要求讀該資料物件的內容,而另一些 程序則要求寫操作,對此,把只想讀的程序稱為 讀者 而把要求寫的程序稱為 寫者 在 讀者 寫著問題中,任何時刻要求 寫者 最多隻允許有乙個,而讀者則允許有多個。因為多個 讀者的行為互不干擾,他們只是讀資料,而不改...