秒殺多執行緒第十篇 生產者消費者問題
》的生產者消費者問題一樣,讀者寫者也是乙個非常著名的同步問題。讀者寫者問題描述非常簡單,有乙個寫者很多讀者,多個讀者可以同時讀檔案,但寫者在寫檔案時不允許有讀者在讀檔案,同樣有讀者在讀檔案時寫者也不去能寫檔案。
上面是讀者寫者問題示意圖,類似於生產者消費者問題的分析過程,首先來找找哪些是屬於「等待」情況。
第一.寫者要等到沒有讀者時才能去寫檔案。
第二.所有讀者要等待寫者完成寫檔案後才能去讀檔案。
vc 控制台顏色設定
》)。因此在這裡要加個互斥訪問,不然很有可能在寫者執行緒將控制台顏色設定還原之前,讀者執行緒就已經有輸出了。所以要對輸出語句作個互斥訪問處理,修改後的讀者及寫者的輸出函式如下所示:
//讀者執行緒輸出函式
void readerprintf(char *pszformat, ...)
//寫者執行緒輸出函式
void writerprintf(char *pszstr)
讀者執行緒輸出函式所使用的可變引數詳見《
c,c++中使用可變引數
》。解決了互斥輸出問題,接下來再考慮如何實現同步問題。可以設定乙個變數來記錄正在讀檔案的讀者個數,第乙個開始讀檔案的讀者要負責將關閉允許寫者進入的標誌,最後乙個結束讀檔案的讀者要負責開啟允許寫者進入的標誌。這樣第一種「等待」情況就解決了。第二種「等待」情況是有寫者進入時所以讀者不能進入,使用乙個事件就可以完成這個任務了——所有讀者都要等待這個事件而寫者負責觸發事件和設定事件為未觸發。詳細見**中注釋:
//讀者與寫者問題
#include #include #include //設定控制台輸出顏色
bool setconsolecolor(word wattributes)
const int reader_num = 5; //讀者個數
//關鍵段和事件
critical_section g_cs, g_cs_writer_count;
handle g_heventwriter, g_heventnoreader;
int g_nreadercount;
//讀者執行緒輸出函式(變參函式的實現)
void readerprintf(char *pszformat, ...)
//讀者執行緒函式
unsigned int __stdcall readerthreadfun(pvoid pm)
//寫者執行緒輸出函式
void writerprintf(char *pszstr)
//寫者執行緒函式
unsigned int __stdcall writerthreadfun(pvoid pm)
int main()
執行結果如下所示:
根據結果可以看出當有讀者在讀檔案時,寫者執行緒會進入等待狀態中。當寫者執行緒在寫檔案時,讀者執行緒也會排隊等待,說明讀者和寫者已經完成了同步。
以上程式有些複雜,如果直接用訊號量來解決問題會簡化很多:
#include#include #include using namespace std;
const int nreader=3;//讀者數量
const int write_number=2;//寫者需要寫入的次數
int g_file,g_i;
int nwritercount=0,nreadercount=0;
critical_section g_cs;
handle g_hreader,g_hwriter,g_hevent;
bool setconsolecolor(word dw)
return setconsoletextattribute(hconsole,dw);
}void readerprintf(int threadid,char* text) //讀者的輸出
本系列通過
經典執行緒同步問題
來列舉執行緒同步手段的
關鍵段、事件、
互斥量、
訊號量,並作對這四種方法進行了
總結。然後又通過二個著名的執行緒同步例項——
生產者消費者問題
和讀者寫者問題來強化對多執行緒同步互斥的理解與運用。希望讀者們能夠熟練掌握,從而在筆試面試中能夠順利的「秒殺」多執行緒的相關試題,獲得自己滿意的
offer
。部分內容**
多執行緒的讀者寫者問題
上面是讀者寫者問題示意圖,類似於生產者消費者問題的分析過程,首先來找找哪些是屬於 等待 情況。第一 寫者要等到沒有讀者時才能去寫檔案。第二 所有讀者要等待寫者完成寫檔案後才能去讀檔案。vc 控制台顏色設定 因此在這裡要加個互斥訪問,不然很有可能在寫者執行緒將控制台顏色設定還原之前,讀者執行緒就已經有...
多執行緒同步之讀者寫者問題
問題定義 現有一塊共享記憶體,多個讀程序和多個寫程序。多個讀程序可以同時讀,但是當有乙個寫程序正在寫時,其他任何讀程序或寫程序都不能執行。該問題有3種變種。第一種稱為 讀者優先 readers preference 在此情況下,只要有程序在讀,寫程序就得等待。實現如下 include include...
讀者寫者問題
生產者消費者問題一樣,讀者寫者也是乙個非常著名的同步問題。讀者寫者問題描述非常簡單,有乙個寫者很多讀者,多個讀者可以同時讀檔案,但寫者在寫檔案時不允許有讀者在讀檔案,同樣有讀者在讀檔案時寫者也不去能寫檔案。上面是讀者寫者問題示意圖,類似於生產者消費者問題的分析過程,首先來找找哪些是屬於 等待 情況。...