轉自:http://yaronspace.cn/blog/archives/1135
讀寫鎖比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, 出錯則返回錯誤編號.