總結
乙個資料物件若被多個併發程序所共享,且其中一些程序只要求讀該資料物件的內容,而另一些當讀者進行讀時,後續的寫者必須等待,直到所有的讀者均離開後,寫著才可進入。程序則要求寫操作,對此,把只想讀的程序稱為「讀者」,而把要求寫的程序稱為「寫者」。在
讀者–寫著問題中,任何時刻要求「寫者」最多隻允許有乙個,而讀者則允許有多個。因為多個
讀者的行為互不干擾,他們只是讀資料,而不改變資料物件的內容,而寫者則不同,他們要改變資料物件的內容,如果他們同時操作,則資料物件的內容將會改變的不可知。
為了解決「寫著與寫著」和「寫著與第乙個讀者」的互斥問題即可,為此引入互斥訊號量wmutex。為了記錄誰是第乙個讀者,可以用乙個全域性整型變數rcount做乙個計數器。而在解決問題的過程中,由於使用了全域性變數rcount,該變數又是乙個臨界資源,對於他的訪問仍需互斥進行,所以需要乙個互斥訊號量rmutex。
import time
import threading
from threading import semaphore
import random
wmutex = semaphore(1)
rmutex = semaphore(1)
rcount =
0sleept =
1def
reader
(i):
print
('reader'
+str
(i)+
' waiting to read\n'
, end='')
rmutex.acquire(
)global rcount
if rcount ==0:
wmutex.acquire(
) rcount +=
1 rmutex.release(
)print
('reader'
+str
(i)+
' reading\n'
, end='')
time.sleep(sleept)
print
('reader'
+str
(i)+
' finish read\n'
, end='')
rmutex.acquire(
) rcount -=
1if rcount ==0:
wmutex.release(
) rmutex.release(
)def
writer
(i):
print
('writer'
+str
(i)+
' waiting to write\n'
, end='')
wmutex.acquire(
)print
('writer'
+str
(i)+
' writing\n'
, end='')
time.sleep(sleept)
print
('writer'
+str
(i)+
' finish write\n'
, end='')
wmutex.release(
)if __name__ ==
'__main__'
: times =
10 rwlist =
for _ in
range
(times):0
,1))
print
(rwlist)
rindex =
1 windex =
1for i in rwlist:
if i ==1:
t = threading.thread(target=reader, args=
(rindex,))
rindex +=
1 t.start(
)else
: t = threading.thread(target=writer, args=
(windex,))
windex +=
1 t.start(
)
[1,
1,0,
1,1,
1,1,
1,1,
1]reader1 waiting to read
reader1 reading
reader2 waiting to read
reader2 reading
writer1 waiting to write
reader3 waiting to read
reader3 reading
reader4 waiting to read
reader4 reading
reader5 waiting to read
reader5 reading
reader6 waiting to read
reader6 reading
reader7 waiting to read
reader7 reading
reader8 waiting to read
reader8 reading
reader9 waiting to read
reader9 reading
reader2 finish read
reader1 finish read
reader4 finish read
reader3 finish read
reader7 finish read
reader8 finish read
reader6 finish read
reader5 finish read
reader9 finish read
writer1 writing
writer1 finish write
process finished with exit code 0
當乙個寫著後面讀者比較多的時候,讀的操作比較頻繁的時候,寫者可能處於較長的
時間等待,使得寫者處於『餓死』現象中
讀者寫者問題(讀者優先,寫者優先 ,讀寫公平)
讀者優先的解決方案 互斥訊號量wrt,初值是1,代表乙個共享檔案,解決 讀 寫 互斥,寫 寫 互斥。乙個記數器,即整型變數readcount,記錄讀者數,初值是0。來乙個讀者,readcount加1 當readcount 1表示是第乙個讀者,則需要執行p操作搶占檔案 否則表示已有讀者在安全的讀資料。...
讀者寫者問題(讀者優先 寫者優先 公平競爭)
讀者優先 1.寫者 讀者互斥訪問檔案資源。2.多個讀者可以同時訪問檔案資源。3.只允許乙個寫者訪問檔案資源。具體實現 1.設定訊號量filesrc實現讀寫者對臨界資源的訪問。2.設定計數器readcount來統計訪問臨界資源的讀者數目,設定訊號量readcountsignal完成對readcount...
讀者寫者問題
生產者消費者問題一樣,讀者寫者也是乙個非常著名的同步問題。讀者寫者問題描述非常簡單,有乙個寫者很多讀者,多個讀者可以同時讀檔案,但寫者在寫檔案時不允許有讀者在讀檔案,同樣有讀者在讀檔案時寫者也不去能寫檔案。上面是讀者寫者問題示意圖,類似於生產者消費者問題的分析過程,首先來找找哪些是屬於 等待 情況。...