併發程式設計之執行緒的讀寫鎖

2021-10-24 20:09:39 字數 2145 閱讀 5842

1.概念

2.讀寫鎖的狀態

3.讀寫鎖特性

4.讀寫鎖的適用場景

5.主要資料型別和應用函式

6.編碼舉例

讀寫鎖實際上是一種特殊的自旋鎖,它把共享資源的訪問劃分成讀者和寫者,讀者只能擁有對共享資源的讀許可權,寫者則需要對共享資源進行寫操作。讀寫鎖並不是兩把鎖,它是乙個名字叫做讀寫鎖的鎖,可以擁有讀模式下加鎖狀態,寫模式下加鎖狀態和不加鎖者三種狀態。它與互斥量類似,對比互斥量,使用讀寫鎖可以使得執行有更高的並行性。

a.讀模式下加鎖狀態(讀鎖)

b.寫模式下加鎖狀態(寫鎖)

c.不加鎖狀態

精煉概括:寫獨佔,讀共享。

更具體點可如下:

1.讀寫鎖是「寫模式加鎖」時(寫鎖),解鎖前,所有對該鎖加鎖的執行緒都會被阻塞;

2.讀寫鎖是「讀模式加鎖」時(讀鎖),如果t1中讀鎖已經加鎖成功了,此時來了三個其他執行緒,分情況討論:

t1以讀模式加鎖成功,t2,t3,t4都請求寫鎖,t2,t3,t4都會阻塞,後續寫鎖自由競爭;

t1以讀模式加鎖成功,t2請求寫,t3和t4請求讀,此時t2,t3,t4都會被阻塞,但是等待t1完成讀釋放鎖之後,優先滿足寫執行緒t2,之後滿足t3和t4的讀請求,因為寫鎖請求的t2的優先順序高.

t1以讀模式加鎖成功,t2,t3,t4都請求讀鎖,可共享去讀。

讀寫鎖非常適合於對資料結構讀的次數遠遠大於寫的情況。
讀寫鎖資料型別

讀寫鎖變數

例項pthread_rwlock_t

pthread_rwlock_t rwlock(定義了乙個讀寫鎖變數rwlock)

標頭檔案:

#include 函式體:

int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict attr);

int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

返回值:

以上共7個函式的返回值在成功情況下都返回0,失敗的時候i返回int型別的錯誤號。

/*

編碼日期:20201016

**功能:三個寫執行緒對全域性共享資源變數進行讀操作,五個讀執行緒對全域性共享資源變數進行讀操作

編碼目的:演示讀寫鎖的使用

執行環境:

linux localhost.localdomain 3.10.0-957.el7.x86_64 #1 smp thu nov 8 23:39:32 utc 2018 x86_64 x86_64 x86_64 gnu/linux

*/#include #include #include int counter; // 定義全域性共享資源變數

pthread_rwlock_t rwlock;// 定義全域性讀寫鎖變數

// 寫執行緒

void *th_write(void* arg)

return null;

}// 讀執行緒

void *th_read(void* arg)

return null;

}int main()

多執行緒程式設計之讀寫鎖

讀寫問題是乙個經典的同步問題,主要針對保護很少更新的資料結構這種同步情況。假設有乙個用於儲存dns條目快取的表,它用來將網域名稱解析為相應的ip位址。通常,乙個給定的dns條目將在很長一段時間裡保持不變 在許多情況下,dns條目會保持數年不變。雖然隨著使用者訪問不同的 新的條目可能會被不時地新增到表...

多執行緒程式設計之讀寫鎖

多執行緒程式設計之讀寫鎖 pthread是 posix threads 的簡稱,是posix的執行緒標準。pthread讀寫鎖把對共享資源的訪問者分為讀者和寫者,讀者只對共享資源進行讀訪問,寫者只對共享資源進行寫操作。在互斥機制,讀者和寫者都需要獨立獨佔互斥量以獨佔共享資源,在讀寫鎖機制下,允許同時...

Linux多執行緒程式設計之讀寫鎖

讀寫鎖也是執行緒同步中的一種同步機制,簡單的來說 讀寫鎖既有讀的方面也有寫的方面,其中讀是共享鎖,而寫是獨佔鎖,而且系統中讀寫鎖的分配是寫鎖優先的。下面的用例,證明了讀鎖是共享鎖。thread fun1中加了讀鎖,但並沒有解讀鎖 thread fun2中也可以加讀鎖執行 如果thread fun2中...