Linux多線程開發-線程同步-讀寫鎖

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);

 

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