讀寫鎖比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, 出錯則返回錯誤編號.