操作系统复习(读者-写者问题)

在写相关伪代码的过程中,我发现,在调整读者数量的过程中有这样的代码

P(rmutex);
if(readcount == 0) P(mutex);
readcount ++ ;
V(rmutex);
read F;
P(rmutex);
readcount -- ;
if(readcount == 0) V(mutex);
V(rmutex);

这给我整懵了,读者不是可以同时访问吗?这里为什么还要互斥使用呢?

书上这里的解释是

rmutex用于读者互斥访问计数器readcount,mutex用于写者与其他读者/写者互斥访问共享数据

这里好像重复了...

而且后来我发现写者的代码

P(mutex);
Wfite F;
V(mutex);

这里也是使用mutex信号量,所以,到底是什么情况?mutex到底负责哪些区域?

经过认真思考,得出如下思路:

这里,rmutex所扮演的角色,是表示有读者开始使用,mutex则是对共享资源的限制,即上面所说的互斥访问共享数据。读者在改变readcount的时候,需要互斥访问(P/V(mutex)),防止产生错误的数值。但是在read F这里,就没有处理,即,可以多个同时读。至于写者的时候,因为要改变F,而且读者和写者是互斥使用的,所以,这里改变mutex,使得,哪怕此时有读者在进程中,也会卡在改变readcount那里。

最后一个问题,rmutex到底有没有必要?

个人认为,有。

虽然,mutex可以保证此时只有一个读者在使用readcount,但是,存在一种情况,一大堆读者同时申请要改变mutex,申请数量太多,可能会导致错误产生。(P操作有两个部分,一、减一;二、判断信号量大小并处理。P操作可能会有多个同时执行,又无法停止,就会出错)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值