1、讀寫鎖概念
對資源的訪問抽象爲兩種類型,即獨佔和共享。獨佔資源具有排他性,例如寫操作。共享資源可以同時由多個線程訪問,不對該資源執行寫操作。針對資源的讀和寫操作分別加鎖,寫操作加鎖與互斥鎖相同,但讀操作加鎖可以讓多個線程同時訪問。
優點:互斥鎖進入臨界區後,未獲得鎖的線程會阻塞,因此,會降低程序的併發效率。讀寫鎖可以對讀操作高效訪問,提高資源利用效率,併發性能更高。
POSIX庫中用類型pthread_rwlock_t來定義互斥鎖,類型在pthreadtypes.h中定義。
2、如何聲明一個讀寫鎖
#include <pthread.h>
pthread_rwlock_t rwlock;
3、如何初始化一個讀寫鎖
//靜態初始化讀寫鎖
pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
//動態初始化讀寫鎖
pthread_rwlock_t rwlock;
pthread_rwlock_init(&rwlock,NULL);
靜態初始化的讀寫鎖不需要銷燬,動態初始化的讀寫鎖需要銷燬,銷燬函數聲明如下:
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
4、如何上鎖和解鎖
//讀模式:上鎖方式1,程序進入臨界區,如果寫模式已經上鎖,則阻塞等待,如果讀模式上鎖,則獲得鎖進入臨界區
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
//讀模式:上鎖方式2,程序進入臨界區,如果讀寫已經上鎖,不阻塞,返回EBUSY
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
//寫模式:上鎖方式1,程序進入臨界區,如果讀寫已經上鎖,不阻塞,返回EBUSY
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
//寫模式:上鎖方式2,程序進入臨界區,如果讀寫已經上鎖,不阻塞,返回EBUSY
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
//解鎖,程序退出臨界區
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);