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

题目

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

答案

在这里插入图片描述

代码

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
发布了94 篇原创文章 · 获赞 40 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_46218781/article/details/105128096