讀者寫者問題

2021-06-12 07:50:23 字數 2383 閱讀 3835

生產者消費者問題一樣,讀者寫者也是乙個非常著名的同步問題。讀者寫者問題描述非常簡單,有乙個寫者很多讀者,多個讀者可以同時讀檔案,但寫者在寫檔案時不允許有讀者在讀檔案,同樣有讀者在讀檔案時寫者也不去能寫檔案。

上面是讀者寫者問題示意圖,類似於生產者消費者問題的分析過程,首先來找找哪些是屬於「等待」情況。

第一.寫者要等到沒有讀者時才能去寫檔案。

第二.所有讀者要等待寫者完成寫檔案後才能去讀檔案。

vc 控制台顏色設定

》)。因此在這裡要加個互斥訪問,不然很有可能在寫者執行緒將控制台顏色設定還原之前,讀者執行緒就已經有輸出了。所以要對輸出語句作個互斥訪問處理,修改後的讀者及寫者的輸出函式如下所示:

[cpp]view plain

copy

//讀者執行緒輸出函式

void

readerprintf(

char

*pszformat, ...)  

//寫者執行緒輸出函式

void

writerprintf(

char

*pszstr)    

讀者執行緒輸出函式所使用的可變引數詳見《

c,c++中使用可變引數

》。解決了互斥輸出問題,接下來再考慮如何實現同步問題。可以設定乙個變數來記錄正在讀檔案的讀者個數,第乙個開始讀檔案的讀者要負責將關閉允許寫者進入的標誌,最後乙個結束讀檔案的讀者要負責開啟允許寫者進入的標誌。這樣第一種「等待」情況就解決了。第二種「等待」情況是有寫者進入時所以讀者不能進入,使用乙個事件就可以完成這個任務了——所有讀者都要等待這個事件而寫者負責觸發事件和設定事件為未觸發。詳細見**中注釋:

[cpp]view plain

copy

//讀者與寫者問題

#include 

#include 

#include 

//設定控制台輸出顏色

bool

setconsolecolor(

word

wattributes)  

const

intreader_num = 5;  

//讀者個數

//關鍵段和事件

critical_section g_cs, g_cs_writer_count;  

handle

g_heventwriter, g_heventnoreader;  

intg_nreadercount;  

//讀者執行緒輸出函式(變參函式的實現)

void

readerprintf(

char

*pszformat, ...)  

//讀者執行緒函式

unsigned int

__stdcall readerthreadfun(

pvoid

pm)  

//寫者執行緒輸出函式

void

writerprintf(

char

*pszstr)  

//寫者執行緒函式

unsigned int

__stdcall writerthreadfun(

pvoid

pm)  

intmain()    

執行結果如下所示:

根據結果可以看出當有讀者在讀檔案時,寫者執行緒會進入等待狀態中。當寫者執行緒在寫檔案時,讀者執行緒也會排隊等待,說明讀者和寫者已經完成了同步。

本系列通過

經典執行緒同步問題

來列舉執行緒同步手段的

關鍵段、事件、

互斥量、

訊號量,並作對這四種方法進行了

總結。然後又通過二個著名的執行緒同步例項——

生產者消費者問題

和讀者寫者問題來強化對多執行緒同步互斥的理解與運用。希望讀者們能夠熟練掌握,從而在筆試面試中能夠順利的「秒殺」多執行緒的相關試題,獲得自己滿意的

offer。從《

秒殺多執行緒第十篇

生產者消費者問題》到《

秒殺多執行緒第十一篇

讀者寫者問題》可以得出多執行緒問題的關鍵在於找到所有「等待」情況和判斷有無需要互斥訪問的資源。那麼如何從實際問題中更好更快更全面的找出這些了?請看《秒殺多執行緒第十二篇

多執行緒同步內功心法——

pv操作上》和《秒殺多執行緒第十三篇

多執行緒同步內功心法——

pv操作下》這二篇以加強解決多執行緒同步問題的「內功」。

另外,讀者寫者問題可以用讀寫鎖srwlock來解決

讀者寫者問題

問題簡述 讀者 寫者問題的讀寫操作限制 包括讀者優先和寫者優先 1 寫 寫互斥,即不能有兩個寫者同時進行寫操作。2 讀 寫互斥,即不能同時有乙個執行緒在讀,而另乙個執行緒在寫。3 讀 讀允許,即可以有乙個或多個讀者在讀。讀者優先的附加限制 如果乙個讀者申請進行讀操作時已有另乙個讀者正在進行讀操作,則...

讀者 寫者問題

讀者 寫者問題 讀者 寫者問題 readers writers problem 也是乙個經典的併發程式設計問題,是經常出現的一種同步問題。計算機系統中的資料 檔案 記錄 常被多個程序共享,但其中某些程序可能只要求讀資料 稱為讀者 reader 另一些程序則要求修改資料 稱為寫者 writer 就共享...

讀者 寫者問題

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