1. 特性:
一次只有一個線程可以佔有寫入模式的讀寫鎖, 但是可以有多個線程同時佔有讀模式的讀寫鎖. 正是因為這個特性,
- 當讀寫鎖是寫加鎖狀態時, 在這個鎖被解鎖之前, 所有試圖對這個鎖加鎖的線程都會被阻塞.
- 當讀寫鎖在讀加鎖狀態時, 所有試圖以讀模式對它進行加鎖的線程都可以得到訪問權, 但是如果線程希望以寫入模式對此鎖進行加鎖, 它必須阻塞知道所有的線程釋放鎖.
- 通常, 當讀寫鎖處於讀模式鎖住狀態時, 如果有另外線程試圖以寫入模式加鎖, 讀寫鎖通常會阻塞隨後的讀模式鎖請求, 這樣可以避免讀模式鎖長期佔用, 而等待的寫入模式鎖請求長期阻塞.
2. 適用性:
讀寫鎖適合於對資料結構的讀次數比寫次數多得多的情況. 因為, 讀模式鎖定時可以共用, 以寫入模式鎖住時意味著獨佔, 所以讀寫鎖又叫共用-獨佔鎖.
3. 初始化和銷毀:
#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, 出錯則返回錯誤編號.
同互斥量以上, 在釋放讀寫鎖佔用的記憶體之前, 需要先通過pthread_rwlock_destroy對讀寫鎖進行清理工作, 釋放由init分配的資源.
4. 讀和寫:
#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個函數分別實現擷取讀鎖, 擷取寫鎖和釋放鎖的操作. 擷取鎖的兩個函數是阻塞操作, 同樣, 非阻塞的函數為:
#include <pthread.h>
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
成功則返回0, 出錯則返回錯誤編號.
非阻塞的擷取鎖操作, 如果可以擷取則返回0, 否則返回錯誤的EBUSY.
5. 屬性設定
#include <pthread.h>int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);
int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *restrict attr, int *restrict pshared);
int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr,int pshared);
pthread_rwlockattr_setkind_np (attr, pref)
參考:http://blog.csdn.net/dai_weitao/archive/2007/08/21/1752843.aspx