读者写者问题

 读者写者问题描述如下:

1.同一时刻允许多个进程读

2.只要有进程在写读进程就应该阻塞

3.只要有进程在写写进程就应该阻塞

所以利用记录型信号量代码如下:

var rmutex,wmutex:semaphore :=1,1

readcount:integer :=0;  

Reader:begin

repeat

wait(rmutex);

if(readcount==0) wait(wmutex);//当没有进程读时看是否有写进程

readcount :=readcount+1;

signal(rmutex);

readwords.....

wait(rmutex);

readcount :=readcount-1;

if(readcount==0) sigal(wmutex);//没有进程读时,可让进程去写.这句仅仅是最后一个读

完的进程所执行的语句。

signal(rmutex);

until false;

end

Writer:

begin

repeat

wait(wmutex);

writewords;

signal(wmutex);

until false 

end



用 AND型信号量解决如下:

var R,wmutex:semaphore :=1,1

Reader:begin

repeat

wait(R,1,1);//和记录型信号量一样

wait(wmutex,1,0);//起开关作用,只要wmutex>=1,Reader就可以读。wmutex=0就不能读

readwords.....

signal(R,1);//和记录型信号量一样

until false;

end

Writer:

begin

repeat

wait(wmutex,1,1;R,RN,0);//既无写进程写时&&R>=RN即没有读进程读时

writewords;

signal(wmutex,1);//和记录型信号量一样

until false 

end


 

 

      

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值