【读写锁】特性、接口及常见问题分析

读写锁

  1. 适用的场景
    少量写的线程 + 大量读的线程
    读写锁和互斥锁很相似,但是读写锁允许读的并行
  2. 读写锁的三种状态
    读模式的加锁状态
    写模式的加锁状态
    不加锁的状态
  3. 加锁规则
    一次只有一个线程可以占有写模式的读写锁,不能同时写,但能同时读,即一个执行流进行写的时候,其他执行流既不能写也不能读,一个执行流进行读的时候,其他执行流可以读,但是不能写
    多个线程可以同时去占有读模式的读写锁,在读写锁的内部实现了一个引用计数,每打开一个读模式的读写锁,引用计数进行加 1 操作,当读写锁进行释放的时候,会对引用计数进行减 1 操作,直到引用计数完全减为 0,则表示读模式的读写锁就解锁了

接口

  1. 定义
    pthread_rwlock_t
  2. 初始化
    pthread_rwlock_init(pthread_rwlock_t*, pthread_rwlockattr_t*)
  3. 加锁
    pthread_rwlock_rdlock(pthread_rwlock_t*)//读模式打开
    pthread_rwlock_wtlock(pthread_rwlock_t*)//写模式打开
  4. 解锁
    pthread_rwlock_unlock(pthread_rwlock_t*)
  5. 销毁
    pthread_rwlock_destroy(pthread_rwlock_t*)

常见问题

**问题:**如果有多个线程同时以读的方式获取读写锁,在此之后,有一个线程想要以写的方式获取读写锁,读写锁底层如何操作?
**答案:**线程 A、B、C 的读模式打开,线程 D 的写模式打开,阻塞先要以写方式获取读写锁的线程,直到所有的读模式线程将读写锁释放,才进行加锁操作

**问题:**以上面的情况(有多个线程同时以读的方式获取读写锁,在此之后,有一个线程想要以写的方式获取读写锁)为基础,又来了一个线程要以读的方式获取读写锁 D ,C 会一直等到 D 读完吗?
**答案:**不是,操作系统会先阻塞后面想要以读方式打开的 D,保证 C 不会等待太长时间,以免资源被长时间占用

发布了53 篇原创文章 · 获赞 115 · 访问量 7637

猜你喜欢

转载自blog.csdn.net/qq_44759710/article/details/104640974