Linux读写锁详解

本文详细介绍了Linux读写锁的概念、用法及实际应用。读写锁允许多个读取线程共享资源,而写入线程必须独占资源,以实现线程同步。文章通过示例代码展示了如何初始化、获取和释放读写锁,并通过一个实例解释了读写锁在多线程程序中的作用。
摘要由CSDN通过智能技术生成

多线程程序中,如果仅有少数线程会对共享数据进行修改,多数线程只是读取共享数据的值,就适合用读写锁解决“线程间抢夺资源”的问题。

读写锁的核心思想是:将线程访问共享数据时发出的请求分为两种,分别是:

  • 读请求:只读取共享数据,不做任何修改;
  • 写请求:存在修改共享数据的行为。

当有多个线程发出读请求时,这些线程可以同时执行,也就是说,共享数据的值可以同时被多个发出读请求的线程获取;当有多个线程发出写请求时,这些线程只能一个一个地执行(同步执行)。此外,当发出读请求的线程正在执行时,发出写请求的线程必须等待前者执行完后才能开始执行;当发出写请求的线程正在执行时,发出读请求的线程也必须等待前者执行完后才能开始执行。

本质上,读写锁就是一个全局变量,发出读请求和写请求的线程都可以访问它。为了区别线程发出的请求类别,当读写锁被发出读请求的线程占用时,我们称它为“读锁”;当读写锁被发出写请求的线程占用时,称它为“写锁”。

为了让您更清楚地了解读写锁在多线程程序中发挥的作用,我们制作了下面这张表格:

当前读写锁的状态 线程发出“读”请求 线程发出“写”请求
无锁 允许占用 允许占用
读锁 允许占用 阻塞线程执行
写锁 阻塞线程执行 阻塞线程执行

从上表可以看出,不同状态下的读写锁会以不同的方式处理发出读请求或写请求的线程:

1) 当读写锁未被任何线程占用时,发出读请求和写请求的线程都可以占用它。注意,由于读请求和写请求的线程不能同时执行,读写锁默认会优先分配给发出读请求的线程。

2) 当读写锁的状态为“读锁”时,表明当前执行的是发出读请求的线程(可能有多个)。此时如果又有线程发出读请求,该线程不会被阻塞,但如果有线程发出写请求,它就会被阻塞,直到读写锁状态改为“无锁”。

3) 当读写锁状态为“写锁”时,表明当前执行的是发出写请求的线程(只能有 1 个)。此时无论其它线程发出的是读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值