题目
利用管程实现读者写者问题(要求:读者优先)
答案
代码
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