讀者寫者問題 讀者優先 python測試)

2021-09-28 12:45:12 字數 3193 閱讀 3002

總結

乙個資料物件若被多個併發程序所共享,且其中一些程序只要求讀該資料物件的內容,而另一些

程序則要求寫操作,對此,把只想讀的程序稱為「讀者」,而把要求寫的程序稱為「寫者」。在

讀者–寫著問題中,任何時刻要求「寫者」最多隻允許有乙個,而讀者則允許有多個。因為多個

讀者的行為互不干擾,他們只是讀資料,而不改變資料物件的內容,而寫者則不同,他們要改變資料物件的內容,如果他們同時操作,則資料物件的內容將會改變的不可知。

當讀者進行讀時,後續的寫者必須等待,直到所有的讀者均離開後,寫著才可進入。

為了解決「寫著與寫著」和「寫著與第乙個讀者」的互斥問題即可,為此引入互斥訊號量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...

讀者寫者問題

生產者消費者問題一樣,讀者寫者也是乙個非常著名的同步問題。讀者寫者問題描述非常簡單,有乙個寫者很多讀者,多個讀者可以同時讀檔案,但寫者在寫檔案時不允許有讀者在讀檔案,同樣有讀者在讀檔案時寫者也不去能寫檔案。上面是讀者寫者問題示意圖,類似於生產者消費者問題的分析過程,首先來找找哪些是屬於 等待 情況。...