在編寫多執行緒的時候,有一種情況是十分常見的。那就是,有些公共資料修改的機會比較少。相比較改寫,它們讀的機會反而高的多。通常而言,在讀的過程中,往往伴隨著查詢的操作,中間耗時很長。給這種**段加鎖,會極大地降低我們程式的效率。那麼有沒有一種方法,可以專門處理這種多讀少寫的情況呢?
有,那就是讀寫鎖。
(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 ...
多執行緒的那點兒事(之巢狀鎖)
巢狀鎖這個概念,主要是為了根據程式設計中的一種情形引申出來的。什麼情況呢,我們可以具體說明一下。假設你在處理乙個公共函式的時候,因為中間涉及公共資料,所以你加了乙個鎖。但是,有一點比較悲哀。這個公共函式自身也加了乙個鎖,而且和你加的鎖是一樣的。所以,除非你的使用的是訊號量,要不然你的程式一輩子也獲取...