讀寫鎖是另一種實現執行緒間同步的方式。與互斥量類似,但讀寫鎖將操作分為讀、寫兩種方式,可以多個執行緒同時占用讀模式的讀寫鎖,這樣使得讀寫鎖具有更高的並行性。
讀寫鎖的特性為:寫獨佔,讀共享;寫鎖優先順序高。對於讀寫鎖,掌握了這12個字就足矣了。
linux環境下,讀寫鎖具有以下三種狀態:
1. 讀模式下加鎖狀態 (讀鎖)
2. 寫模式下加鎖狀態 (寫鎖)
3. 不加鎖狀態
雖然讀寫鎖有讀鎖、寫鎖、不加鎖三種狀態,但其實它只有一把鎖,而非三把。
前文提到,讀寫鎖的特性為:寫獨佔,讀共享;寫鎖優先順序高。具體來講:
1. 讀寫鎖是「寫模式加鎖」時, 解鎖前,所有嘗試對該鎖進行加鎖(不管是讀鎖還是寫鎖)的執行緒都會被阻塞;--> 寫獨佔
2. 讀寫鎖是「讀模式加鎖」時, 如果執行緒以讀模式對其加鎖會成功;如果執行緒以寫模式加鎖會阻塞。--> 讀共享
3. 讀寫鎖是「讀模式加鎖」時, 既有試圖以寫模式加鎖的執行緒,也有試圖以讀模式加鎖的執行緒。那麼讀寫鎖會阻塞隨後的讀模式鎖請求,優先滿足寫模式鎖。--> 寫鎖優先順序高
讀寫鎖也叫共享-獨佔鎖。當讀寫鎖以讀模式鎖住時,它是以共享模式鎖住的;當它以寫模式鎖住時,它是以獨佔模式鎖住的。寫獨佔、讀共享。
讀寫鎖非常適合於對資料結構讀的次數遠大於寫的情況。因為讀鎖是共享的,這樣可以提高並行性。
主要應用函式:
pthread_rwlock_init函式
pthread_rwlock_destroy函式
pthread_rwlock_rdlock函式
pthread_rwlock_wrlock函式
pthread_rwlock_tryrdlock函式
pthread_rwlock_trywrlock函式
pthread_rwlock_unlock函式
以上7 個函式的返回值都是:成功返回0,失敗直接返回錯誤號。
pthread_rwlock_t型別:用於定義乙個讀寫鎖變數,比如:pthread_rwlock_t rwlock;
pthread_rwlock_init函式
函式原型:
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
函式作用:
初始化一把讀寫鎖
引數說明:
rwlock:傳出引數,呼叫時應傳&rwlock給該函式;
attr:表示讀寫鎖屬性,通常傳null,表示使用預設屬性;
pthread_rwlock_destroy函式
函式原型:
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
函式作用:
銷毀一把讀寫鎖
pthread_rwlock_rdlock函式
函式原型:
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
函式作用:
以讀方式請求讀寫鎖。(常簡稱為:請求讀鎖)
pthread_rwlock_wrlock函式
函式原型:
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
函式作用:
以寫方式請求讀寫鎖。(常簡稱為:請求寫鎖)
pthread_rwlock_unlock函式
函式原型:
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
函式作用:
解鎖。pthread_rwlock_tryrdlock函式
函式原型:
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
函式作用:
非阻塞以讀方式請求讀寫鎖(非阻塞請求讀鎖)
pthread_rwlock_trywrlock函式
函式原型:
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
函式作用:
非阻塞以寫方式請求讀寫鎖(非阻塞請求寫鎖)
/* 3個執行緒不定時 "寫" 全域性資源,5個執行緒不定時 "讀" 同一全域性資源 */
#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
(void)
Linux系統程式設計 讀寫鎖rwlock
讀寫鎖是另一種實現執行緒間同步的方式。與互斥量類似,但讀寫鎖將操作分為讀 寫兩種方式,可以多個執行緒同時占用讀模式的讀寫鎖,這樣使得讀寫鎖具有更高的並行性。讀寫鎖的特性為 寫獨佔,讀共享 寫鎖優先順序高。對於讀寫鎖,掌握了這12個字就足矣了。linux環境下,讀寫鎖具有以下三種狀態 讀模式下加鎖狀態...
Linux系統程式設計讀寫鎖和條件變數使用
linux系統程式設計讀寫鎖和條件變數使用 文章目錄 1.讀寫鎖概念 2.條件變數的概念和使用 1.讀寫鎖概念 1.讀寫鎖的適用場景?互斥鎖 讀寫序列 讀寫鎖 讀 並行 寫 序列 程式中的讀操作大於寫操作的時候 2.展示 建立三個寫執行緒,建立五個讀執行緒 為了防止資料混亂 cpu排程問題 需要給共...
Linux系統程式設計 執行緒互斥鎖
在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時 還沒有列印完 別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。下面我們用程式模擬一下這個過程,執行緒一需要列印 hello 執行緒二需要...