读写锁
- 适用的场景
少量写的线程 + 大量读的线程
读写锁和互斥锁很相似,但是读写锁允许读的并行 - 读写锁的三种状态
读模式的加锁状态
写模式的加锁状态
不加锁的状态 - 加锁规则
一次只有一个线程可以占有写模式的读写锁,不能同时写,但能同时读,即一个执行流进行写的时候,其他执行流既不能写也不能读,一个执行流进行读的时候,其他执行流可以读,但是不能写
多个线程可以同时去占有读模式的读写锁,在读写锁的内部实现了一个引用计数,每打开一个读模式的读写锁,引用计数进行加 1 操作,当读写锁进行释放的时候,会对引用计数进行减 1 操作,直到引用计数完全减为 0,则表示读模式的读写锁就解锁了
接口
- 定义
pthread_rwlock_t - 初始化
pthread_rwlock_init(pthread_rwlock_t*, pthread_rwlockattr_t*) - 加锁
pthread_rwlock_rdlock(pthread_rwlock_t*)//读模式打开
pthread_rwlock_wtlock(pthread_rwlock_t*)//写模式打开 - 解锁
pthread_rwlock_unlock(pthread_rwlock_t*) - 销毁
pthread_rwlock_destroy(pthread_rwlock_t*)
常见问题
**问题:**如果有多个线程同时以读的方式获取读写锁,在此之后,有一个线程想要以写的方式获取读写锁,读写锁底层如何操作?
**答案:**线程 A、B、C 的读模式打开,线程 D 的写模式打开,阻塞先要以写方式获取读写锁的线程,直到所有的读模式线程将读写锁释放,才进行加锁操作
**问题:**以上面的情况(有多个线程同时以读的方式获取读写锁,在此之后,有一个线程想要以写的方式获取读写锁)为基础,又来了一个线程要以读的方式获取读写锁 D ,C 会一直等到 D 读完吗?
**答案:**不是,操作系统会先阻塞后面想要以读方式打开的 D,保证 C 不会等待太长时间,以免资源被长时间占用