多執行緒的那點兒事(之讀寫鎖)

2021-08-14 10:03:52 字數 1326 閱讀 6000

在編寫多執行緒的時候,有一種情況是十分常見的。那就是,有些公共資料修改的機會比較少。相比較改寫,它們讀的機會反而高的多。通常而言,在讀的過程中,往往伴隨著查詢的操作,中間耗時很長。給這種**段加鎖,會極大地降低我們程式的效率。那麼有沒有一種方法,可以專門處理這種多讀少寫的情況呢?

有,那就是讀寫鎖。

(1)首先,我們定義一下基本的資料結構。

[cpp]view plain

copy

typedef

struct

_rwlock  

rwlock;     

同時,為了判斷當前的鎖是處於讀狀態,還是寫狀態,我們要定義乙個列舉量,

[cpp]view plain

copy

typedef

enum

;  

(2)初始化資料結構

[cpp]view plain

copy

rwlock* create_read_write_lock(

handle

hread, 

handle

hwrite)    

(3)獲取讀鎖

[cpp]view plain

copy

void

read_lock(rwlock* prwlock)  

releasemutex(prwlock->hread);  

}  

(4)獲取寫鎖

[cpp]view plain

copy

void

write_lock(rwlock* prwlock)    

(5)釋放讀寫鎖

[cpp]view plain

copy

void

read_write_unlock(rwlock* prwlock)  

releasemutex(prwlock->hread);  

}else

return

;  }  

文章總結:

(1)讀寫鎖的優勢只有在多讀少寫、**段執行時間長這兩個條件下才會效率達到最大化;

(2)任何公共資料的修改都必須在鎖裡面完成;

(3)讀寫鎖有自己的應用場所,選擇合適的應用環境十分重要;

(4)編寫讀寫鎖很容易出錯,朋友們應該多加練習;

(5)讀鎖和寫鎖一定要分開使用,否則達不到效果。

多執行緒的那點兒事(之讀寫鎖)

在編寫多執行緒的時候,有一種情況是十分常見的。那就是,有些公共資料修改的機會比較少。相比較改寫,它們讀的機會反而高的多。通常而言,在讀的過程中,往往伴隨著查詢的操作,中間耗時很長。給這種 段加鎖,會極大地降低我們程式的效率。那麼有沒有一種方法,可以專門處理這種多讀少寫的情況呢?有,那就是讀寫鎖。1 ...

多執行緒的那點兒事(之讀寫鎖)

在編寫多執行緒的時候,有一種情況是十分常見的。那就是,有些公共資料修改的機會比較少。相比較改寫,它們讀的機會反而高的多。通常而言,在讀的過程中,往往伴隨著查詢的操作,中間耗時很長。給這種 段加鎖,會極大地降低我們程式的效率。那麼有沒有一種方法,可以專門處理這種多讀少寫的情況呢?有,那就是讀寫鎖。1 ...

多執行緒的那點兒事(之巢狀鎖)

巢狀鎖這個概念,主要是為了根據程式設計中的一種情形引申出來的。什麼情況呢,我們可以具體說明一下。假設你在處理乙個公共函式的時候,因為中間涉及公共資料,所以你加了乙個鎖。但是,有一點比較悲哀。這個公共函式自身也加了乙個鎖,而且和你加的鎖是一樣的。所以,除非你的使用的是訊號量,要不然你的程式一輩子也獲取...