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

读写锁

  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 不会等待太长时间,以免资源被长时间占用

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值