多執行緒 讀寫者問題

2021-06-06 20:27:53 字數 2304 閱讀 1785

秒殺多執行緒第十篇 生產者消費者問題

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

上面是讀者寫者問題示意圖,類似於生產者消費者問題

的分析過程,首先來找找哪些是屬於「等待」情況。

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

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

vc 控制台顏色設定

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

[cpp]view plain

copy

print?

//讀者執行緒輸出函式

voidreaderprintf(char*pszformat, ...)  

//寫者執行緒輸出函式

voidwriterprintf(char*pszstr)    

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

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

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

[cpp]view plain

copy

print?

//讀者與寫者問題

#include 

#include 

#include 

//設定控制台輸出顏色

boolsetconsolecolor(wordwattributes)  

const

intreader_num = 5;  //讀者個數

//關鍵段和事件

critical_section g_cs;  

handleg_heventwriter, g_heventnoreader;  

intg_nreadercount;  

//讀者執行緒輸出函式

voidreaderprintf(char*pszformat, ...)  

//讀者執行緒函式

unsignedint__stdcall readerthreadfun(pvoidpm)  

//寫者執行緒輸出函式

voidwriterprintf(char*pszstr)  

//寫者執行緒函式

unsignedint__stdcall writerthreadfun(pvoidpm)  

intmain()    

執行結果如下所示:

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

本系列通過

經典執行緒同步問題

來列舉執行緒同步手段的

關鍵段、事件、

互斥量、

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

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

生產者消費者問題

和讀者寫者問題

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

offer

多執行緒讀寫mysql 多執行緒讀寫mysql資料庫

該樓層疑似違規已被系統摺疊 隱藏此樓檢視此樓 unsigned int stdcall scan pvoid pm char ip 20 strcpy ip,char pm mysql mysql mysql res result 初始化mysql控制代碼 mysql init mysql 連線my...

多執行緒13 讀者寫者問題繼 讀寫鎖SRWLock

在前面的 文章中我們使用 事件和乙個記錄讀者個數的變數來解決讀者寫者問題。問題雖然得到了解決,但 有點複雜。本篇將介紹一種新方法 讀寫鎖srwlock 來解決這一問題。讀寫鎖在對資源進行保護的同時,還能區分想要讀取資源值的執行緒 讀取者執行緒 和想要更新資源的執行緒 寫入者執行緒 對於讀取者執行緒,...

讀寫者問題

只要求讀檔案的程序稱為reader程序,其他程序稱為writer程序。允許多個程序同時讀乙個共享物件,但不允許乙個writer程序和其他reader程序同時或writer程序同時訪問乙個共享物件。簡單來說,讀寫者問題是保證乙個writer程序必須與其他程序互斥的訪問共享物件的同步問題。三句話來說,就...