当前位置: 首页 > news >正文

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

读者写者模式

读写锁

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

读写锁原理细节:

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

读写锁接口

设置读写优先

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. 若队首是写者:只允许这一个写者独占资源,写完才轮到下一批进程

效果

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

http://www.jsqmd.com/news/1297604/

相关文章:

  • 嵌入式开发必知:USART、IIC、SPI、485、CAN五大通讯协议核心对比与实战选型
  • 天津geo优化公司哪家服务好?广拓时代谈内容可信度判断
  • 鹰潭母婴除甲醛公司测甲醛中心怎么选:金耀母婴除甲醛标准、流程、避坑指南 - 信誉隆金银铂奢回收
  • 如何永久保存你的QQ空间青春记忆?开源QZoneExport一键备份完整指南
  • 梧州母婴除甲醛公司测甲醛中心怎么选:金耀母婴除甲醛标准、流程、避坑指南 - 信誉隆金银铂奢回收
  • 通辽母婴除甲醛公司测甲醛中心怎么选:金耀母婴除甲醛标准、流程、避坑指南 - 信誉隆金银铂奢回收
  • 常见的7个Jmeter压测问题
  • SubtitleEdit字幕编辑器:5个核心功能让你轻松制作专业字幕
  • GB/T 14710-2009是什么?医用设备必过的 “魔鬼环境试炼”
  • Vue.js中this.$refs.xxx为undefined的完整解决方案
  • WorkBuddy 三种工作模式详解:Craft、Plan、Ask 如何掌控 AI 自主权
  • Windows 11终极优化指南:5分钟实现系统性能提升的完整开源方案
  • TXD Studio汉化与使用指南:GTA模组贴图管理新选择
  • 多邻国架构实战:构建高效多语言系统的核心设计与实现
  • C51单片机驱动3461AS-1数码管:从硬件原理到动态扫描代码实战
  • 营口母婴除甲醛公司测甲醛中心怎么选:金耀母婴除甲醛标准、流程、避坑指南 - 信誉隆金银铂奢回收
  • Graph Engineering 精读:Agent 的计划如何进入代码
  • Brooke Havok与Jazmin Allure女子摔角技术对决深度解析
  • 武汉母婴除甲醛公司测甲醛中心怎么选:金耀母婴除甲醛标准、流程、避坑指南 - 信誉隆金银铂奢回收
  • 2026年近期竞秀区千问搜索优化:本土服务商如何实现专业价值落地 - 装修教育财税推荐2026
  • SWFNet:当脉冲神经网络遇见小波变换——VVC压缩360度视频质量增强的新范式
  • 假面骑士Build Evolto腰带套装评测:一站式全形态玩法解析
  • 威海母婴除甲醛公司测甲醛中心怎么选:金耀母婴除甲醛标准、流程、避坑指南 - 信誉隆金银铂奢回收
  • 2026张掖黄金回收白银回收铂金回收中检持证鉴定师铂金银饰高价回收门店联系方式推荐
  • L298N电机驱动模块深度解析:从基础原理到实战避坑指南
  • 2026年精选:河南口碑好的注册公司企业服务推荐——从创业起点到财税合规的全周期护航 - 装修教育财税推荐2026
  • 天津geo优化服务商有哪些?广拓时代按企业需求分类说明
  • SpringBoot乡镇人口信息管理系统开发实践
  • 西安母婴除甲醛公司测甲醛中心怎么选:金耀母婴除甲醛标准、流程、避坑指南 - 信誉隆金银铂奢回收
  • 眉山母婴除甲醛公司测甲醛中心怎么选:金耀母婴除甲醛标准、流程、避坑指南 - 信誉隆金银铂奢回收