在写相关伪代码的过程中,我发现,在调整读者数量的过程中有这样的代码
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操作可能会有多个同时执行,又无法停止,就会出错)