linux 執行緒(六 讀寫鎖

2021-10-05 15:27:34 字數 2843 閱讀 6498

讀者—寫者問題的變種問題,每個都是基於讀者和寫者的優先順序

適用的場景

少量寫+大量讀

與互斥量類似,但讀寫鎖允許更高的並行性。其特性為:寫獨佔,讀共享。

讀寫鎖的三種狀態

讀模式下的加鎖狀態

寫模式下的加鎖狀態

不加鎖的狀態

加鎖規則寫:

讀: 計數變數的作用:

在於判斷釋放讀模式開啟的讀寫鎖的,是否能夠完全解鎖;

如果引用計數完全減為0 ,則以讀模式的讀寫鎖就解鎖了;

大於0 :否則讀寫鎖還是以讀模式開啟,和想要以寫模式開啟進行互斥

讀寫鎖特性

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

讀寫鎖是「讀模式加鎖」時, 如果執行緒以讀模式對其加鎖會成功;如果執行緒以寫模式加鎖會阻塞。

讀寫鎖是「讀模式加鎖」時, 要是既有試圖以寫模式加鎖的執行緒,也有試圖以讀模式加鎖的執行緒。那麼讀寫鎖會阻塞隨後的讀模式鎖請求。要是寫鎖優先順序高,則優先滿足寫模式鎖。

讀寫鎖也叫共享-獨佔鎖。當讀寫鎖以讀模式鎖住時,它是以共享模式鎖住的;當它以寫模式鎖住時,它是以獨佔模式鎖住的。寫獨佔、讀共享

設定讀寫優先順序

int pthread_rwlockattr_setkind_np(pthread_rwlockattr_t *attr, int pref);/*

pref 共有 3 種選擇

pthread_rwlock_prefer_reader_np (預設設定) 讀者優先,可能會導致寫者飢餓情況

pthread_rwlock_prefer_writer_np 寫者優先,目前有 bug,導致表現行為和pthread_rwlock_prefer_reader_np 一致

pthread_rwlock_prefer_writer_nonrecursive_np 寫者優先,但寫者不能遞迴加鎖

*/void init_rwlock(

)//設定讀寫優先順序

初始化

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

;

加鎖和解鎖

int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock)

;//以讀模式開啟(加鎖)

int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock)

;//以寫模式開啟(加鎖)

int pthread_rwlock_unlock(pthread_rwlock_t *rwlock)

;//解鎖

銷毀

int pthread_rwlock_destroy(pthread_rwlock_t *rwlock)

;

簡單讀寫鎖例子

#include 

#include

#include

volatile int counter=20; //資源數

pthread_rwlock_t rwlock;//定義讀寫鎖

/* 2個執行緒寫同一全域性資源,3個執行緒讀同一全域性資源 */

void *th_write(void *arg)

printf(

"*****==writeer %lu: writeed_counter=%d\n", pthread_self(

), --counter)

; pthread_rwlock_unlock(

&rwlock)

; sleep(1);}

return null;

}void *th_read(void *arg)

printf(

"-------reader %lu: readed_counter: %d\n", pthread_self(

), counter)

; pthread_rwlock_unlock(

&rwlock)

; sleep(1);}

return null;

}int main(void)

怎麼實現的讀共享

訊號量w控制對訪問共享物件的臨界區的訪問。訊號量mutex保護對共享變數(讀者數量)readcnt的訪問,readcnt 統計當前在臨界區中的讀者數量。每當乙個寫者進人臨界區時,它對互斥鎖w加鎖,每當它離開臨界區時,對w解鎖。這就保證了任意時刻臨

界區中最多只有乙個寫者。另一方面,只有第乙個進入臨界區的讀者對w加鎖,而只有最後乙個離開臨界區的讀者對w解鎖。當乙個讀者進人和離開臨界區時,如果還有其他讀者在臨界區中,那麼這個讀者會忽略互斥鎖w。這就意味著只要還有乙個讀者占用互斥鎖w,無限多數量的讀者可以沒有障礙地進人臨界區。

//這裡的pv操作分別封裝了 sem_wait 和 sem_post函式

int readcnt;

sem_t mutex, w; //定義訊號量

void reader (void)//讀模式

}

讀者優先順序高可能導致寫者飢餓(starvation), 飢餓就是一乙個執行緒無限期地阻塞,無法進展。例如,如果有讀者不斷地到達,寫者就可能無限期地等待。

Linux執行緒同步 讀寫鎖

讀寫鎖和互斥量 互斥鎖 很類似,是另一種執行緒同步機制,但不屬於posix標準,可以用來同步同一程序中的各個執行緒。當然如果乙個讀寫鎖存放在多個程序共享的某個記憶體區中,那麼還可以用來進行程序間的同步.和互斥量不同的是 互斥量會把試圖進入已保護的臨界區的執行緒都阻塞 然而讀寫鎖會視當前進入臨界區的執...

linux程式設計 執行緒 讀寫鎖

讀寫鎖通訊機制 讀寫鎖分為讀鎖和寫鎖,功能如下 1 如果某執行緒申請了讀鎖,其他執行緒可以再申請讀鎖,但不能申請寫鎖。2 如果某執行緒申請了寫鎖,則其他執行緒不能申請讀鎖,也不能申請寫鎖。初始化讀寫鎖 int pthread rwlock init pthread rwlock t restrict...

Linux 下的執行緒讀寫鎖

linux 下的執行緒讀寫鎖 有一種寫優先讀寫鎖,有如下特點 1 多個讀者可以同時進行讀 2 寫者必須互斥 只允許乙個寫者寫,也不能讀者寫者同時進行 3 寫者優先於讀者 一旦有寫者,則後續讀者必須等待,喚醒時優先考慮寫者 在solaris 中直接提供了讀寫鎖,但是在linux 中只提供了執行緒的讀寫...