讀者—寫者問題的變種問題,每個都是基於讀者和寫者的優先順序適用的場景
少量寫+大量讀
與互斥量類似,但讀寫鎖允許更高的並行性。其特性為:寫獨佔,讀共享。
讀寫鎖的三種狀態
讀模式下的加鎖狀態
寫模式下的加鎖狀態
不加鎖的狀態
加鎖規則寫:
讀: 計數變數的作用:
在於判斷釋放讀模式開啟的讀寫鎖的,是否能夠完全解鎖;
如果引用計數完全減為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 中只提供了執行緒的讀寫...