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中...