文章目录

  • 读者写者问题
    • 读者优先
      • 1.初始化
      • 2.写者
      • 3.读者
    • 写者优先
      • 1.初始化
      • 2.读者
      • 3.写者
      • 4.考虑读者1->写者1->读者2的情况

读者写者问题

1.允许多个读者可以同时对文件执行读操作
2.只允许一个写者往文件写信息
3.任一写者在完成写操作之前不允许其他读者后写者工作
4.写者执行写操作前,应该让已有的读者或者写者全部退出

读者优先

1.初始化
semaphore wmutex=1;//实现对文件的互斥访问,表示当前是否有进程在访问共享文件
int readcount=0;//记录当前有多少个读进程在访问文件
semaphore rmutex;//用于保证对readcount变量的互斥访问
2.写者
writer(){while(1){P(wmutex);//写之前加锁写文件...V(wmutex);//写之后解锁}}
3.读者
reader(){while(1){P(rmutex);//各读进程互斥访问readcountreadcount++;//访问文件读进程数+1if(readcount==1)P(wmutex);//写进程加锁,不允许在读操作过程中执行写操作V(rmutex);读文件...           //上面这一部分使得多个读者能够同时访问P(rmutex);//各读进程互斥访问raeadcountreadcount--;//每当一个读进程完成读操作,读者数量-1if(readcount==0)V(wmutex);//当没有读者,读操作结束后,写进程解锁V(rmutex);}}

写者优先

1.初始化
int readcount=0;//记录当前有多少个读进程在访问文件
int writecount=0;//当writecount=0,唤醒读者
semaphore mutex1;//用于保证对readcount变量的互斥访问
semaphore mutex2;//用于保证对writecount变量的互斥访问semaphore mutex;//用于保证写者之间的互斥访问,其他读者要进入rmutex之前需要在mutex上排队
semaphore rmutex=1;//当有新写者来时,停止所有的读进程。
semaphore wmutex=1;//实现对写操作地互斥访问
2.读者
reader(){while(1){P(mutex);//实现写者优先访问,禁止读者在rmutex排队,保证一次只有一个读者进程访问rmutexP(rmutex);//读者进程加锁P(mutex1);//互斥修改readcount变量readcount++;if(readcount==1)P(wmutex);//当有读者进程执行读操作时,对写者进程加锁V(mutex1);V(rmutex);//读者进程解锁V(mutex);读文件...P(mutex1);//互斥修改readcount变量readcount--;if(readcount==0)V(wmutex);//当读者数量为0,解锁写者进程,允许写者进程执行写操作V(mutex1);}
3.写者
writer(){while(1){P(mutex2);//各写者进程互斥访问writecountwritecount++;//写进程数量+1if(writecount==1)P(rmutex);//有写进程时,对读进程加锁V(mutex2);P(wmutex);//写之前加锁,保证每次只有一个写者可以进行写操作写文件...V(wmutex);P(mutex2);writecount--;//每当有一个写进程完成写操作,写者数量-1if(writecount==0)V(rmutex);//若没有写进程正在执行,解锁读者进程V(mutex2);}}

当有一个写者要执行写操作时,P(mutex2)加锁,写者数+1,当此时是第一个写者时,对读进程加锁,禁止在进行写操作过程读进程进行访问,完成对writecount的修改后,V(mutex2)解锁。

(当有多个写进程进行访问时,最先的一个写进程能够进入临界区执行写操作,其他写进程在writecount++后,会被阻塞在P(wmutex)这一步)

P(wmutex)加锁,写进程执行写操作,在改进程未完成时,由于wmutex=0,其他写进程会被阻塞在临界区前,即不能执行写操作,写操作完成后,V(wmutex)解锁。

此时写者数量需要减1,P(mutex2)加锁,修改writecount,当写者数为0,V(rmutex)唤醒读者进程。

所以,对于写者进程信号量mutex2 是为了保证互斥地访问writecount变量,对它的修改。
wmutex 是为了互斥地访问写操作。

4.考虑读者1->写者1->读者2的情况

读者1按照读进程执行到读文件操作,假设此时有一个写进程,由于在执行读进程1时执行了以下语句

if(readcount==1)P(wmutex);//当有读者进程执行读操作时,对写者进程加锁

写进程会被阻塞在写操作前,而读者2进程由于写者进程1执行了以下语句

if(writecount==1)P(rmutex);//有写进程时,对读进程加锁

读者2进程会被阻塞在P(rmutex)这一步。
当读者1进程执行完读操作,对写进程解锁后,此时wmutex=1

     读文件...P(mutex1);//互斥修改readcount变量readcount--;if(readcount==0)V(wmutex);//当读者数量为0,解锁写者进程,允许写者进程执行写操作V(mutex1);

写者进程继续执行写操作

P(wmutex);//写之前加锁,保证每次只有一个写者可以进行写操作写文件...V(wmutex);P(mutex2);writecount--;//每当有一个写进程完成写操作,写者数量-1if(writecount==0)V(rmutex);//若没有写进程正在执行,解锁读者进程V(mutex2);

执行完写操作后,解锁读者进程,rmutex=1,读者2进程继续执行。

可以看出在这种情况下,写者进程不需要等待所有读者进程完成读操作后才能执行写操作,实现了写者优先。

读者写者问题(超详细讲解)看不懂算我输相关推荐

  1. 动漫:史上最简(详细)KMP算法讲解,看不懂算我输!

    刚关注阿广的朋友们可能不太了解我 我也做个自我介绍 不客气的讲 通过下面的小细节 你也可能体会到阿广一个什么样的人了 (以上为凑字数够300字发原创) 所以公共前后缀的条件为: 1.最长的前后缀 2. ...

  2. Linux - samba实现Linux与windows文件共享——共享文件夹目标文件访问权限被拒绝解决方案(超详细,看不懂你怪我)

    前言 最近做一个项目,需要用到linux上的内容,于是需要将linux与window共享文件,上网查阅了一些资料,做完了之后,总结一下自己遇到的问题,以及自己是咋解决的,供大家参考. 这里其实只需要一 ...

  3. Git超详解五 变基 (看不懂算我输)

    变基 1.变基 2.基本操作 3.解决冲突 4.什么时候使用变基 5.注意事项 1.变基 变基也是将一个分支的代码整合到另外一个分支.跟merge功能类似,但也存在着很大的不同.变基可以把提交线整合得 ...

  4. 初中生也能看懂的狭义相对论(1.世界是什么?)(原子,质子和分子)(看不懂算我输)

    世界是什么?对于这个问题人类给出了无数种答案,列一些有代表性的: 佛:是浮云 老子:是虚无 泰勒斯:是水 毕达哥拉斯:是数 留基伯和德谟克利特:是原子 中国古代人民:金木水火土 这些答案都各有各的特点 ...

  5. 【每日一算法】KMP算法,看不懂算我输!

    微信改版,加星标不迷路! 每日一算法-KMP算法详解 作者:poll的笔记 阅读目录 1 字符串匹配 2 KMP算法 1 字符串匹配 字符串匹配是计算机的基本任务之一. 字符串匹配是什么?举例来说,有 ...

  6. 设计模式:简单工厂模式(C++)【看不懂算我输】

    简单工厂模式介绍 简单工厂模式并不是Gof四人帮搞的23中设计模式中的一种,只不过大部分的设计模式书籍都会介绍它.所有我们还是来看看它,或许你觉得很简单.但是我们可以瞧瞧它有什么优点和缺点.如何进行改 ...

  7. 运筹优化学习15:求解线性规划的单纯形法【手把手计算,够你应付考试了,看不懂算我输】

    目录 1 理论部分 1.1 单纯形表的要素含义解释 1.2 计算步骤 2 计算示例 2.1 初始单纯形表 2.2 第二次变换 2.3 第三次变换 2.4 第四次变换 3 参考文档 本博主研究了一天没有 ...

  8. 简述TCP三次握手,看不懂算我输!

    TCP 三次握手 举个例子简单描述下TCP的三次握手: 就举打电话的列子吧. TCP三次握手就是如此. 通过彼此之间发送三个包(过程就如上面对话一样),来确认client与server之间连接是否互通 ...

  9. java的renameTo函数的两个用法,这个看不懂算我输

    查了网上关于renameTo的用法没找到一个说明白的,有的说的也晦涩难懂,我就总结一下: 一共两个常用的用法: 对文件进行重命名   此动作限定在同一个文件夹,即file1.renameTo(file ...

最新文章

  1. 观《逻辑思维,如何成为一个高手》
  2. 机器学习内卷化:博士数量激增,本硕毕业生有点慌|reddit
  3. 《云计算揭秘企业实施云计算的核心问题》——导读
  4. LeetCode 10 正则表达式匹配
  5. julia const报错_我爱Julia之入门-004
  6. sql加上唯一索引后批量插入_MySQL当批量插入遇上唯一索引
  7. MOTChallenge榜单第一!用于多目标跟踪简单高效的数据关联方法 BYTE
  8. composition java_阿里P7架构师通过源码浅析Java中的资源加载
  9. spring-boot-maven-plugin 插件
  10. 【js】【前台输入效验】【validate插件的使用】 前端
  11. Android动态切换主题
  12. 如何在同一Linux服务器上创建多站点
  13. Mybatis通过原生sql查询Map结果集注意事项
  14. 个人使用winRAR时提示我们注册激活怎么解决?
  15. 使用WEPE一键安装系统
  16. 易语言大漠插件模块制作后台找字FindStrExS和FindStrFastExS
  17. Classical Maths Books Intro
  18. 公众号推送长图最佳尺寸_微信公众平台图片尺寸是多少
  19. 百度地图点击地图获取地址
  20. ce修改面板属性_改属性【dnfce修改器吧】_百度贴吧

热门文章

  1. php打开页面的快捷键,窗口切换快捷键是什么
  2. 这Python 的20个骚操作,让我月薪涨了3K!
  3. 微信小程序【My简历】的功能简介
  4. python学习(十五) 内建模块学习
  5. 安全之AAA服务器--路由器认证,授权,审计
  6. Twitter推出名为“Gizzard”的分布式数据存储框架
  7. Qt模仿QQ聊天窗口界面(三)
  8. gtasa服务器文件,GTASA详细解析文件
  9. java.lang.NoSuchMethodException: co.yixiang.modules.product.domain.YxStockRecord.<init>()
  10. 双11购物的凑单问题与财务凑数问题