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

2021-06-18 01:10:14 字數 2279 閱讀 2729

在前面的

文章中我們使用

事件和乙個記錄讀者個數的變數來解決讀者寫者問題。問題雖然得到了解決,但**有點複雜。本篇將介紹一種新方法——讀寫鎖srwlock

來解決這一問題。

讀寫鎖在對資源進行保護的同時,還能區分想要讀取資源值的執行緒(讀取者執行緒)和想要更新資源的執行緒(寫入者執行緒)。對於讀取者執行緒,讀寫鎖會允許他們併發的執行。當有寫入者執行緒在占有資源時,讀寫鎖會讓其它寫入者執行緒和讀取者執行緒等待。因此用讀寫鎖來解決讀者寫者問題會使**非常清晰和簡潔。

下面就來看看如何使用讀寫鎖,要注意編譯讀寫鎖程式需要vs2008,執行讀寫鎖程式要在vista或windows server2008系統(比這兩個更高階的系統也可以)。讀寫鎖的主要函式就五個,分為初始化函式,寫入者執行緒申請和釋放函式,讀取者執行緒申請和釋放函式,以下是詳細的函式使用說明:

第乙個initializesrwlock

函式功能:初始化讀寫鎖

函式原型:

void

initializesrwlock

(psrwlock

srwlock);

函式說明:初始化(沒有刪除或銷毀

srwlock

的函式,系統會自動清理)

第二個acquiresrwlockexclusive

函式功能:寫入者執行緒申請寫資源。

函式原型:

void

acquiresrwlockexclusive

(psrwlock

srwlock);

第三個releasesrwlockexclusive

函式功能:寫入者執行緒寫資源完畢,釋放對資源的占用。

函式原型:

void

releasesrwlockexclusive

(psrwlock

srwlock);

第四個acquiresrwlockshared

函式功能:讀取者執行緒申請讀資源。

函式原型:

void

acquiresrwlockshared

(psrwlock

srwlock);

第五個releasesrwlockshared

函式功能:讀取者執行緒結束讀取資源,釋放對資源的占用。

函式原型:

void

releasesrwlockshared

(psrwlock

srwlock);

注意乙個執行緒僅能鎖定資源一次,不能多次鎖定資源。  

使用讀寫鎖精簡後的**如下(**中變參函式的實現請參閱《c,c++中使用可變引數》,控制台顏色設定請參閱《vc 控制台顏色設定》):

//讀者與寫者問題繼 讀寫鎖srwlock

#include #include #include //設定控制台輸出顏色

bool setconsolecolor(word wattributes)

const int reader_num = 5; //讀者個數

//關鍵段和事件

critical_section g_cs;

srwlock g_srwlock;

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

void readerprintf(char *pszformat, ...)

//讀者執行緒函式

unsigned int __stdcall readerthreadfun(pvoid pm)

//寫者執行緒輸出函式

void writerprintf(char *pszstr)

//寫者執行緒函式

unsigned int __stdcall writerthreadfun(pvoid pm)

int main()

對比下《秒殺多執行緒第十一篇讀者寫者問題

》中的**就可以發現這份**確實清爽許多了。這個程式用

vs2008

編譯可以通過,但在

xp系統下執行會導致報錯。

在win7

系統下能夠正確的執行,結果如圖所示:

最後總結一下讀寫鎖srwlock

1.讀寫鎖宣告後要初始化,但不用銷毀,系統會自動清理讀寫鎖。

2.讀取者和寫入者分別呼叫不同的申請函式和釋放函式。

多執行緒的讀者寫者問題

上面是讀者寫者問題示意圖,類似於生產者消費者問題的分析過程,首先來找找哪些是屬於 等待 情況。第一 寫者要等到沒有讀者時才能去寫檔案。第二 所有讀者要等待寫者完成寫檔案後才能去讀檔案。vc 控制台顏色設定 因此在這裡要加個互斥訪問,不然很有可能在寫者執行緒將控制台顏色設定還原之前,讀者執行緒就已經有...

多執行緒11 讀者寫者問題

秒殺多執行緒第十篇 生產者消費者問題 的生產者消費者問題一樣,讀者寫者也是乙個非常著名的同步問題。讀者寫者問題描述非常簡單,有乙個寫者很多讀者,多個讀者可以同時讀檔案,但寫者在寫檔案時不允許有讀者在讀檔案,同樣有讀者在讀檔案時寫者也不去能寫檔案。上面是讀者寫者問題示意圖,類似於生產者消費者問題的分析...

多執行緒同步之讀者寫者問題

問題定義 現有一塊共享記憶體,多個讀程序和多個寫程序。多個讀程序可以同時讀,但是當有乙個寫程序正在寫時,其他任何讀程序或寫程序都不能執行。該問題有3種變種。第一種稱為 讀者優先 readers preference 在此情況下,只要有程序在讀,寫程序就得等待。實現如下 include include...