APUE:線程:讀寫鎖rwlock

讀寫鎖比mutex有更高的適用性,可以多個線程同時佔用讀模式的讀寫鎖,但是隻能一個線程佔用寫模式的讀寫鎖。
1. 當讀寫鎖是寫加鎖狀態時,在這個鎖被解鎖之前,所有試圖對這個鎖加鎖的線程都會被阻塞;
2. 當讀寫鎖在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的線程都可以得到訪問權,但是以寫模式對它進行枷鎖的線程將阻塞;
3. 當讀寫鎖在讀模式鎖狀態時,如果有另外線程試圖以寫模式加鎖寫鎖必須堵塞直到所有的線程釋放之前的讀鎖讀寫鎖通常會阻塞隨後的讀模式鎖請求,這樣可以避免讀模式鎖長期佔用,而等待的寫模式鎖請求長期阻塞;
這種鎖適用對數據結構進行讀的次數比寫的次數多的情況下,因爲可以進行讀鎖共享。

API接口說明:
1) 初始化和銷燬

#include <pthread.h>
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
成功則返回0, 出錯則返回錯誤編號.

2) 讀加鎖和寫加鎖
獲取鎖的兩個函數是阻塞操作

#include <pthread.h>
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock); 
成功則返回0, 出錯則返回錯誤編號.

3) 非阻塞獲得讀鎖和寫鎖
非阻塞的獲取鎖操作, 如果可以獲取則返回0, 否則返回錯誤的EBUSY.

#include <pthread.h>
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
成功則返回0, 出錯則返回錯誤編號.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章