news 2026/7/31 2:45:45

基于读写锁的读者写者问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于读写锁的读者写者问题

读者写者模式

读写锁

在编写多线程的时候,有一种情况是十分常见的。那就是,有些公共数据修改的机会比较少。相比较改写,它们读的机会反而高的多。通常而言,在读的过程中,往往伴随着查找的操作,中间耗时很长。给这种代码段加锁,会极大地降低我们程序的效率。那么有没有一种方法,可以专门处理这种多读少写的情况呢? 有,那就是读写锁。
读者和读者之间无互斥关系,可并行访问;
读者和写者之间是互斥关系,一方操作时另一方必须等待;
写者和写者之间也是互斥关系。

读写锁原理细节:

第一个到达的读者需要加锁,阻止写者进入; 后续新来的读者直接进入读取,计数累加; 最后一个读完的读者释放锁,写者才有机会写入。

读写锁接口

设置读写优先

int pthread_rwlockattr_setkind_np(pthread_rwlockattr_t *attr, int pref); /* pref 共有 3 种选择 PTHREAD_RWLOCK_PREFER_READER_NP (默认设置) 读者优先,可能会导致写者饥饿情况 PTHREAD_RWLOCK_PREFER_WRITER_NP 写者优先,目前有 BUG,导致表现行为和 PTHREAD_RWLOCK_PREFER_READER_NP 一致 PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP 写者优先,但写者不能递归加锁 */
初始化
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict attr);

销毁:

int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
加锁和解锁
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

读者优先:

只要有读者正在读,后续新来的读者全都可以插队进入读取;写者会一直被阻塞,极易写者饥饿(写者迟迟得不到执行机会)。

共用基础变量:read_count:正在读的读者数量,初值 = 0mutex:保护 read_count 的互斥锁wrt:读写共用锁(写者占用后,任何人都进不来)

一、读者优先

核心思想

只要有读者正在读,后续新来的读者全都可以插队进入读取;写者会一直被阻塞,极易写者饥饿(写者迟迟得不到执行机会)。

共用基础变量:read_count:正在读的读者数量,初值 = 0

mutex:保护 read_count 的互斥锁

wrt:读写共用锁(写者占用后,任何人都进不来)

执行逻辑

  1. 读者到来:
    • 先抢占 mutex 锁,修改 read_count
    • 若自己是第一个读者:抢占 wrt 锁(锁住资源,不让写者进来)
    • read_count++,释放 mutex,开始读文件
  2. 读者离开:
    • 抢占 mutex,read_count--
    • 若自己是最后一个读者:释放 wrt 锁,写者才有资格竞争资源
    • 释放 mutex
  3. 写者到来: 直接申请 wrt 锁,拿不到就阻塞; 只要还有读者在读,wrt 永远不会释放,写者持续等待。

优缺点

✅ 读者效率极高,并发读取顺畅 ❌ 致命缺陷:写者饥饿

二:写者优先:

核心思想

一旦有写者等待资源,后续所有新来的读者全部阻塞排队;必须等所有等待 + 正在执行的写者全部完成后,读者才能继续读。 杜绝写者饥饿,但会出现读者饥饿

新增变量:write_wait:等待中的写者数目read_queue:读者等待队列

执行逻辑

  1. 只要存在等待的写者:拒绝所有新读者入场
  2. 写者到达优先级 > 新来读者
  3. 所有排队写者依次写完,资源空闲后,才放行积压的读者

优缺点

✅ 写者不会饿死,写入响应快 ❌ 大量读者堆积等待,读者饥饿

三、公平读写(队列先来先服务 FIFO,无饥饿)

核心思想

按照进程到达的先后顺序排队,严格遵循先来后到:

  1. 排在队列首位的进程获得资源使用权
  2. 若队首是读者:连续放行队列里紧随其后的所有读者一起读
  3. 若队首是写者:只允许这一个写者独占资源,写完才轮到下一批进程

效果

读者、写者地位均等,既不会读者饥饿,也不会写者饥饿,整体吞吐最均衡。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/31 2:45:12

游戏开发者日志解析:从武器设计到技术实现全流程

这次我们来看一个游戏开发相关的项目——"第一战队豪兽者 纪念版手誓剑UNI.ver"的开发者日志介绍图。从标题来看,这应该是某个游戏或动漫IP的纪念版本开发记录,包含了角色设计、武器设定等关键信息。对于游戏开发者和动漫爱好者来说&#xff0…

作者头像 李华
网站建设 2026/7/31 2:44:37

685743

4538478

作者头像 李华
网站建设 2026/7/31 2:37:53

每月省2小时:2026年3款荣耀实时转文字哪个好?实测选出高性价比款

先回答用户真正关心的问题 针对2026年3款主流实时转文字工具听脑AI、网易见外工作台、AssemblyAI的实测验证,面向产品、技术人群做用户调研访谈、会议讨论转写整理的需求,若需要兼顾准确率、AI纪要效率和性价比,更推荐优先考虑听脑AI&#x…

作者头像 李华
网站建设 2026/7/31 2:34:36

芯片与嵌入式系统开发:软件仿真、硬件仿真与原型验证全解析

1. 项目概述:从“纸上谈兵”到“眼见为实”的工程验证之路在芯片、嵌入式系统乃至复杂机电产品的开发流程中,有一个环节至关重要却又常常让新手感到困惑:如何在不制造实体硬件的情况下,验证设计的正确性?这就是“软件仿…

作者头像 李华
网站建设 2026/7/31 2:33:36

从Kafka到LLM:我们如何用流式日志构建反爬虫知识图谱

一个反爬员工的自白某天业务方跑来问我:“为什么我们的反爬规则已经配了200多条,还是拦不住爬虫?”我反问他:“你知道黑产现在换IP的速度有多快吗?你配完第201条规则的时候,他们的IP已经换了三轮了。”这不…

作者头像 李华
网站建设 2026/7/31 2:32:22

Adobe GenP 3.0技术深度解析:如何实现Adobe全家桶的智能激活方案

Adobe GenP 3.0技术深度解析:如何实现Adobe全家桶的智能激活方案 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe Creative Cloud作为创意设计领域…

作者头像 李华