要求: (1)多个读者可以同时进行读;

(2)写者必须互斥(只允许一个写者写,也不能读者写者同时进行);

(3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)。

定义读者与写者两个队列: ReadQ与WriterQ,初始值均为空;

定义文件状态 FileState变量,0, write与read三个状态,初始值为0。

若不考虑互斥情况的代码为:

Read()

ReadQ.push();        //读者入队

if((ReadQ.Length()!=0)&&(FileState!=write)&&(WriteQ.Length()==0))

{

FileState=read;

ReadQ.do();            //队列中全部读者执行读操作,队列清空

FileState=0;

}

Writer()

{

WriterQ.push();        //写者入队

if((WriterQ.Length()!=0)&&(FileState!=read))

{

FileState=write;

writer=WriterQ.pop();

writer.do();        //写者执行写操作

FileState=0;

}

}    考虑到互斥的情况,添加变量readcount,初始值为0,并设置信号量mutex。

对应上面的读者与写者两个队列(ReadQ与WriterQ),文件状态 FileState变量设置三个信号量,依次为mutexReadQ,mutexWriterQ和mutexFileState。

代码如下:

Read()

P(mutexWriteQ);

while(WriteQ.Length()!=0)

/*忙等待*/;

V(mutexWriteQ);

P(mutex);

readcount ++;

if (readcount==1)

P(mutexFileState);

V(mutex);

Read.do();    //读者执行读操作

P(mutex);

readcount --;

if (readcount==0)

V(mutexFileState);

V(mutex);

Writer()

{

P(mutexWriteQ);

WriterQ.push();        //写者入队

V(mutexWriteQ);

P(mutexFileState);

P(mutexWriteQ);

writer=WriterQ.pop();

V(mutexWriteQ);

writer.do();        //写者执行写操作

V(mutexFileState);

V(mutexWriteQ);

}

java如何解决写者优先问题_第二类读者写者问题(写者优先)的信号量及PV操作解决方案...相关推荐

  1. 第二类读者写者问题:写者优先

    第二类读者写者问题:写者优先 条件: 多个读者可以同时进行读 写者必须互斥(只允许一个写者写,也不能读者写者同时进行) 写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者) 互斥变量 ...

  2. matlab差分迭代解决静电场边界问题(含第二类边界条件)

    matlab差分迭代解决静电场边界问题(含第二类边界条件) 相关链接:Matlab编程用迭代有限差分求电势分布https://blog.csdn.net/Mr_tea_milk/article/det ...

  3. 试利用记录型信号量和pv操作写出_计算机操作系统知识点汇总

    1.基本特征 (1)并发:并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令.操作系统通过引入进程和线程使得程序能够并发运行: (2)共享:共享是指系统中的资源可以被多个并 ...

  4. java写接口给前端_看看人家那后端API接口写得,那叫一个优雅!

    来源: r6d.cn/tEvn 在移动互联网,分布式.微服务盛行的今天,现在 项目绝大部分都采用的微服务框架,前后端分离方式 ,(题外话: 前后端的工作职责越来越明确 ,现在的前端都称之为 大前端 , ...

  5. python怎么写测试脚本语言_手把手带你,用Python写一个Monkey自动化测试脚本!!!...

    一.为什么需要一个测试脚本? 之前讲解了 Android Monkey 命令的使用方式,今天趁着还热乎就手把手用 Monkey 写一个压力测试的脚本.还不了解什么是 Monkey 的,可以看看之前的文 ...

  6. 试利用记录型信号量和pv操作写出_中考热点,几何操作型问题求解策略,值得关注...

    操作型问题能让学生经历观察,操作,实验,猜想,验证的探究过程.不仅能考查学生的空间观念,对图形的认识,图形的变换,图形的设计,图形的直觉判断能力,而且还能考查学生的分析综合,抽象概括逻辑推理的能力,是 ...

  7. java程序中类的成员变量定义在_.在类体中,变量定义部分所定义的变量称为类的________。...

    .在类体中,变量定义部分所定义的变量称为类的________. .成员变量在整个类内都有效,________变量只在定义它的方法内有效. .Java中成员变量又分为实例成员变量和________. . ...

  8. 4十4十4写成乘法算式_乘法口诀和乘法算式怎么写

    1.4个3相加的乘法算式怎么写 4个3相加的乘法算式表示为3x4. 解:因为乘法是表示将相同的数相加.其运算符号为"x",读作乘号.乘法的运算结果叫做积. 例:n个a相加可以表示为 ...

  9. 试利用记录型信号量和pv操作写出_三门峡c型槽钢抗震支架安装

    抗震支架施工组织设计方案目录章编制依据第二章工程概述第三章施工目标第四章施工组织第五章施工工序及主要施工工艺第六章保证措施及技术第七章安全文明施工措施章编制依据甲方提供图纸及抗震支架设计图纸:公司现行 ...

最新文章

  1. LoadRunner中常见参数和变量
  2. combotree 可以异步加载吗_Unity AssetBundle 资源打包,加载,本地缓存方式,安卓,PC本地加载路径问题...
  3. elementUI的DatePicker+DateTimePicker组件的自定义日期禁用
  4. python可以测试java的代码吗_使用python做你自己的自动化测试--对Java代码做单元测试 (2)-导入第三方jar包裹...
  5. 如何做一个合格的面试官?
  6. socket结构和几个IP地址转换函数
  7. LeetCode Python实现 链表简单部分
  8. 域名使用cname方式跳转不到新域名_七牛云图床和Markdown使用
  9. 高并发系统数据幂等性
  10. java中的StringUtil.isEmpty和StringUtil.isBlank
  11. 基于python生成手写的笔记
  12. SQL Server安装失败,SQL Server卸载不干净
  13. 【Share Backup】FreeCrawl
  14. lcl手术和飞秒区别_全飞秒、半飞秒、ICL、TPRK...教你分清近视手术区别
  15. 跨考西北工业大学计算机专硕,西工大计算机专硕400+上岸学长经验分享
  16. mysql安装教程 mac_Mac下MySQL安装配置教程
  17. MySQL遇到错误:1217 - Cannot delete or update a parent row: a foreign key constraint fails
  18. page_to_phys()和virt_to_phys()
  19. 晚上几点入睡比较好,如果每天1点睡,8点半起,可以保持健康吗?
  20. js 根据日期转换星期

热门文章

  1. HTML点击页面按钮自动刷新页面,如何在Html单击按钮后单击刷新页面
  2. python中字符串类型的encode()方法_第五章 Python字符串常用方法详解
  3. Linux搭建部落冲突,Neovim+Coc.nvim配置 目前个人最舒服终端编辑环境(PythonC++)
  4. 区块链产业园拔地而起,多方面亟待问题解决?
  5. 电脑硬件故障维护小全(十一)
  6. vs2012 异常【System.Runtime.InteropServices.COMException (0x8000FFFF): 灾难性故障 】
  7. match 和 search 和 indexOf 查找及 正则表达式的 exec 和 test 用法
  8. ERP-U9 调入单审批流按子行存储地点自动审批设置
  9. 中国白酒硬仗走向世界舞台——硬仗酒半年横扫国内外三大奖项
  10. ArcGIS Runtime SDK for iOS之Maps和Layers