1、读写锁
(1)What(什么是读写锁)
与互斥锁类似,读写锁的本质也是一个类对象,读锁对象允许读线程对临界区的并行访问,而写线程对临界区只能互斥访问(换言之,读写锁是互斥锁的升级版)
(2)Why(读写锁的作用)
在保护共享资源一致性的基础上提高了并发读的性能(换言之,在实现线程同步的基础上提高了并发读的性能)
(3)How(如何使用读写锁)
step01:定义读写锁及类型
本质就是创建一个读写锁对象,并指定锁的类型是读锁还是写锁
pthread_rwlock_t rwlock;
step02:初始化读写锁对象
本质就是给读写锁对象赋初始值
#include <pthread.h>
int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr = NULL);
- 参数rwlock:要初始化的读写锁对象
- 参数attr:指定读写锁的属性,通常传递 NULL 以使用默认属性
- 返回值:0表示初始化成功
step03:写锁锁定临界区
本质就是调用函数修改读写锁对象的状态,写锁只允许线程互斥访问临界区,当获取失败时,对应的线程会阻塞在这个读写锁对象上
#include <pthread.h>
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
- 参数rwlock:被上写锁的读写锁对象
- 返回值:0表示上写锁成功
step04:读锁锁定临界区
本质就是调用函数修改读写锁对象的状态,读锁允许读线程共同访问临界区,当该锁处于写状态时,会导致上读锁失败,线程阻塞
#include <pthread.h>
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
- 参数rwlock:被上读锁的读写锁对象
- 返回值:0表示上读锁成功
step05:解锁
本质还是调用函数修改读写锁的状态,解锁之后,该读写锁对象对临界区的管理将会解除
#include <pthread.h>
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
- 参数rwlock:将要被释放的读写锁对象
- 返回值:0表示释放读写锁成功
step06:销毁读写锁对象
本质就是释放读写锁占有的内存,以归还给操作系统
#include <pthread.h>
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
- 参数rwlock:被销毁的读写锁对象
- 返回值:0表示销毁成功
(4)读写锁的特征
- 如果是读锁锁定了临界区,那么可以并行读取临界区,因为读锁对读是共享的
- 如果是写锁锁定了临界区,那么只能串行访问临界区,因为写锁对读和写都是独占的