- process Reader(void)
- {
- while(1)
- {
- P(mutex);
- ReadCnt++;
- if(1 == ReadCnt)
- P(w);
- V(mutex);
- /*对数据集进行读操作*/
- P(mutex);
- ReadCnt--;
- if(0 == ReadCnt)
- V(w);
- V(mutex);
- }
- }
- process Writer(void)
- {
- while(1)
- {
- P(w);
- /*对数据集进行写操作*/
- V(w);
- }
- }
- 对于一开始对读进程计数器进行加锁,防止其他读进程访问的原因是:
- 因为读进程的第一个和最后i一个十分重要,第一个读进程要阻塞写进程操作,需要跟写进程去抢占资源
- 而最后一个读进程需要释放跟写进程抢来的资源
- 如果第一个写进程刚刚执行完r++操作,还没来得及判断,这时第二个写进程也执行了这句操作
- 那么就无法判断出这是一个第一个读进程操作
- 而并不是说读进程之间不能同时进行,当 第一个进程执行完 V(mutex),准备去执行读操作是,第二个进程拿到这个计数器资源,计数器增加然后释放之后,第二个进程也可以进行读操作,而此时可以跟第一个读操作同时进行,于此,释放了锁资源,第三个进程也可以继续进行读操作
读者优先:
1.写者、读者互斥访问文件资源。
2.多个读者可以同时访问文件资源。
3.只允许一个写者访问文件资源。
为了防止写进程一直在阻塞
产生了写着优先:
上述条件没有发生改变:还是读写互斥,可以多个读者访问资源,只能一个读者访问
多的是:只要有一个写者想要去访问,不管是读者已经在进行还是跟读者正在抢占资源,一定是写着优先
读者正在读,也会先等会,让写着先去写
在读者优先算法中还没有出现读者的优先级一定高于写着,只是两者公平的去抢占资源,只是读者读者之间可以同时进行,只有当读者为0之后,才能使写着工作,读者优先体现在:一旦一个读者抢到资源,对于第二个读者来说,它不需要在执行p(mutex)资源的抢占了,这个资源对他来说就是开放的,他可以源源不断地进行读操作,直到最后一个读操作才有放出资源的权力,等于是写操作一直等着所有的读操作完成
但是在第一个资源抢占的过程中,并不存在谁的优先级比较高。
但是这里直接加入了写者优先级比较高,首先,读抢资源抢占不过写,其次,读的过程中有可能被阻塞。直到所有写着都完成,读者才有机会去读