【操作系统】利用管程实现读者写者问题(要求:读者优先)

题目

利用管程实现读者写者问题(要求:读者优先)

答案

在这里插入图片描述

代码

Type rw=Monitor

Var rcount:int; //正在读的读者人数

    write:boolean; //是否有人正在写

    rq,wq:condition; //申请读和写的队列

Procedure startr() //开始读

    Begin

        if (write) wait(rq); //有人在写,阻塞自己(到读队列排队)

        rcount++; //离开了wait则表明已被唤醒,可以去读了

        signal(rq); //唤醒下一个等待的读者(可多人同时读)

    End

Procedure endr() //结束读

    Begin

        rcount--; //正在读的读者人数-1

        if (rcount==0) signal(wq); //如果没有人读了,则唤醒等待的第一个写者

    End

Procedure startw() //开始写

    Begin

        if (rcount>0 or write) wait(wq); //有人在读或在写,阻塞自己(到写队列)

        write=true; //修改写状态

    End

Procedure endw() //结束写

    Begin

        write=false; //修改写状态

        //读队列有读者等待,唤醒第一个等待的读者(体现读者优先)

        if (rq!=NULL) signal(rq);

        else signal(wq); //否则唤醒第一个等待的写者

    End

Begin

    rcount=0; //初始化

    write=false; //初始化

End

 

reader:

    repeat

        rw.startr; //准备开始读

        reading... //读

        rw.endr; //结束读

    util false

 

writer:

    repeat

        rw.startw; //准备开始写

        writing... //写

        rw.endw; //结束写

    util false
  • 12
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三桥君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值