尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

读者-写者问题

读者-写者问题
📅 发布时间:2026/6/20 2:22:05

读者-写者两组并发进程,共享一个文件,当两个或两个以上的读进程同时访问共享数据时,不会产生副作用,单如果某个写进程和其他进程(读和写)同时访问共享数据则可能导致数据不一致的错误。

因此要求:

1.允许多个读者可以同时对文件执行读操作

2.只允许一个写者往文件中写信息

3.任意一个写者在完成写操作之前不允许其他读者或者写者工作

4.写者执行写操作之前,应让已有的读者和写者全部退出

读者进程

与消费者进程不同,读者进程在读取数据之后,不会将数据清空。并不会改变数据,因此它们可以同时访问共享数据。

两类进程 :写进程,读进程

互斥关系:

【写进程-写进程】互斥

【写进程-读进程】互斥

【读进程-读进程】不存在互斥关系

semaphore rw=1;//用于实现对共享文件的互斥访问
int count=0;writer(){while(true){P(rw);写;V(rw);}
}reader(){while(true){if (count==0){//第一个读进程负责在读之前枷锁P(rw);   }count++;//访问数量+1读文件;count--;//访问数量-1if(count==0)//有最后一个读进程负责读完后解锁V(rw);}
}

但是如果两个进程并发执行,count=0的时候,两个进程有可能都能满足if条件,都会执行P(rw).如此第二个读进程就会阻塞

因此我们想到了一个办法,我们让进程互斥访问count

semaphore rw=1,mutex=1;//用于实现对共享文件的互斥访问
int count=0;writer(){while(true){P(rw);写;V(rw);}
}reader(){while(true){P(mutex);if (count==0){//第一个读进程负责在读之前枷锁P(rw);   }count++;//访问数量+1V(mutex);读文件;P(mutex);count--;//访问数量-1if(count==0)//有最后一个读进程负责读完后解锁V(mutex);//互斥访问count(释放)V(rw);}
}

但是这样又有一个问题,只要读进程一直在读,写进程就会一直在阻塞等待,有可能会被饿死,因此,在这种算法中,读进程是优先的,而我为了不让这个情况发生

semaphore rw=1,mutex=1;//用于实现对共享文件的互斥访问
int count=0;
semephore w=1//变量用于实现写优先writer(){while(true){P(w);P(rw);写;V(rw);V(w);}
}reader(){while(true){P(w);P(mutex);if (count==0){//第一个读进程负责在读之前枷锁P(rw);   }count++;//访问数量+1V(mutex);V(w);读文件;P(mutex);count--;//访问数量-1if(count==0)//有最后一个读进程负责读完后解锁V(mutex);//互斥访问count(释放)V(rw);}
}

这样当 读者1-》写者1-〉读者2的时候

读者1进程:

会让w变成0再变成1,会让rw变成0

写者1进程:

会把w变成0,但是会因为rw为0而被阻塞

读者2进程:

会因为w为0而被阻塞

读者1完成读后

rw变成1,激活写者1的写文件代码

写者1完成写后

w变成1,读者2被激活

结论:这种算法连续进入的多个读者可以同时读文件,但是写者不难喝进他进程同时访问文件,而且写者不会饥饿,但是这个也不是真正的写优先,而是相对公平的FCFS

部分教材将其称为“读写公平法”

相关新闻

  • 实现邮件发送
  • LuatOS赋能Air780EPM:FTP通信开发教程正式上线!
  • DM40万用表为何全网爆火?!它有哪些与众不同?DM40万用表比肩千元级表,让您轻松实现专业级测量自由!

最新新闻

  • 4.1 自由振动 固有频率与固有振型
  • ComfyUI TTP Toolset:3步掌握8K超分辨率图像分块处理技术,普通电脑也能轻松实现AI图像增强
  • LPC3130/3131 ARM9微控制器:多层AHB总线与引脚复用的嵌入式设计精要
  • 2026衡水2026正规漏水检测维修公司精选口碑榜TOP5权威推荐-精准定位检测漏水点-专业防水补漏堵漏维修、卫生间/厨房/屋顶/天沟/地下室/阳台防水漏水检测维修 - 安佳防水
  • 3种智能编排策略重构AI工作流创作效率
  • PPO算法在大语言模型RLHF训练中的工程实践与调参指南

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号