读写锁是一把锁,是互斥锁的升级版
互斥锁没有说明是锁定读还是锁定写,读写锁有两个功能分别对读和写操作进行锁定
锁的类型是pthread_rwlock_t
读写锁会记录自己现在是锁定状态还是非锁定状态
锁定状态下是读锁定还是写锁定
读写锁的特点
- 使用读写锁对多线程进行同步,线程如果都是读操作,多线程可以并行访问临界区,这里与互斥锁不同
- 线程同时读或者写,多线程在同一个时间点,线程可同时访问临界区,写操作不行,必须和互斥锁一样
- 多线程对临界区进行读写操作时,写的优先级更高,因此多个写线程先抢读写锁,写线程全执行完再执行读线程
执行大量读操作时使用读写锁
函数
- 初始化读写锁
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict attr);- 释放读写锁占用的系统资源
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
rwlock读写锁的地址
attr读写锁的属性,一般采用默认属性给NULL
restrict用于修饰rwlock
加读锁,进行读操作
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock)
- 调用此函数,如果读写锁是打开的,那么加锁成功
- 读写锁已锁定读操作,调用此函数依然可以加锁成功,因为读锁是共享的
读写锁已锁定写操作,调用此这个函数的线程会被阻塞
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock)
- 调用此函数,如果读写锁是打开的,那么加锁成功;
- 读写锁已锁定读操作,调用此函数依然可以加锁成功,因为读锁是共享的
- 读写锁已锁定写操作,调用此函数加锁失败,对应的线程不会被阻塞
可以在程序中对函数返回值进行判断,添加加锁失败之后的处理动作
加写锁,进行写操作
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock)
- 调用此函数,如果读写锁是打开的,那么加锁成功
读写锁已锁定读操作/写操作,调用此函数的线程会被阻塞
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock)
- 调用此函数,如果读写锁是打开的,那么加锁成功
- 读写锁已锁定读操作/写操作,调用此函数的线程不会阻塞
解锁
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock)