多執行緒 學習12

2021-09-06 19:01:05 字數 1929 閱讀 4433

以下內容來自:

前面我們使用事件和乙個記錄讀者個數的變數來解決讀者寫者問題。問題雖然得到了解決,但**有點複雜。本篇將介紹一種新方法——讀寫鎖srwlock來解決這一問題。讀寫鎖在對資源進行保護的同時,還能區分想要讀取資源值的執行緒(讀取者執行緒)和想要更新資源的執行緒(寫入者執行緒)。對於讀取者執行緒,讀寫鎖會允許他們併發的執行。當有寫入者執行緒在占有資源時,讀寫鎖會讓其它寫入者執行緒和讀取者執行緒等待。因此用讀寫鎖來解決讀者寫者問題會使**非常清晰和簡潔。

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

第乙個 initializesrwlock

函式功能:初始化讀寫鎖

函式原型:void 

initializesrwlock(psrwlocksrwlock);

函式說明:初始化(沒有刪除或銷毀srwlock的函式,系統會自動清理)

第二個 acquiresrwlockexclusive

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

函式原型:void 

acquiresrwlockexclusive(psrwlocksrwlock);

第三個 releasesrwlockexclusive

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

函式原型:void 

releasesrwlockexclusive(psrwlocksrwlock);

第四個 acquiresrwlockshared

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

函式原型:void 

acquiresrwlockshared(psrwlocksrwlock);

第五個 releasesrwlockshared

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

函式原型:void 

releasesrwlockshared(psrwlocksrwlock);

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

使用讀寫鎖精簡後的**如下:

#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)

//寫者執行緒函式

加成兩個寫者,驗證結果也正確。

最後總結一下讀寫鎖srwlock

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

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

多執行緒 學習12

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

多執行緒12天 04

執行緒間通訊 優化 package day12 class res catch interruptedexception e this.name name this.this.setflag true this.notify public synchronized void out catch in...

Java基礎12 多執行緒Thrad

注意 1.使用鎖物件呼叫wait 方法 2.直接呼叫run 方法不會啟動執行緒,注意其在main中的執行過程.一.多執行緒 1.建立執行緒 a.定義乙個類繼承thread類,重寫run 方法,建立該類物件,呼叫start 方法.程式會開啟一條新執行緒,在新執行緒上自動呼叫run 方法.b.定義乙個類...