读写锁
1. 读写锁数据类型:
pthread_rwlock_t lock;
2. 读写锁状态:
a. 读锁状态:对内存做读操作
b. 写锁状态:对内存做写操作
3. 读写锁的特性:
a. 线程1加读锁后,又来了多个线程,都做读操作,后来的线程都能加读锁
-- 即读时共享
b. 线程1加写锁后,又来了多个线程,都做读操作,则后来的线程都会阻塞
-- 即写时独占
c. 线程1加读锁成功,后来来了线程2要加写锁,写锁阻塞;又来了线程3要加读锁,读锁阻塞
-- 读写不能同时执行
-- 写的优先级高于读的优先级
4. 场景分析:
a. 线程A持有读锁,然后线程B请求写锁,再有线程C请求读锁
-- 线程B和线程C都阻塞
-- A解锁后,B加写锁成功,C阻塞
-- B解锁后,C加读锁成功
b. 线程A持有写锁,然后线程B请求读锁,再有线程C请求写锁
-- 线程B和线程C都阻塞
-- A解锁后,C写锁优先级高,加写锁成功,B阻塞
-- C解锁后,B加读锁成功
5. 使用场景:
a. 互斥锁:读写串行
b. 读写锁:读并行;写串行 -- 在程序中读操作次数远大于写操作的次数时,优先考虑读写锁
操作读写锁
1. 初始化读写锁:
pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t * restrict attr);
2. 销毁读写锁:
pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
3. 加读锁:
a. 强制加读锁<阻塞>
pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
b. 尝试加读锁<非阻塞>
pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
4. 加写锁:
a. 强制加写锁<阻塞>
pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
b. 尝试加写锁<非阻塞>
pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
5. 解锁:
pthread_rwlock_unlock(pthread_rwlock_t *rwlock);