读者-写者问题总结
-
先写出不包含同步互斥条件的流程
○ 读与读可以同时
○ 写与写不可以同时
○ 写与读不可以同时 -
分析读者进程每种操作的前置条件
○ 读之前要求无写 读与写要竞争
○ 读与读可以同时进行 需要设计一个计数器rcount 来使得第一个读去和写争读写锁 后面来的读就不需要竞争读写锁(注意计数器不是资源)
○ 多个读进程都可以修改rcount 对于多进程共享变量需要互斥访问 用一个mutex来 -
分析写进程每种操作的前置条件
○ 写之前只要占用了读写锁rwlock即可 -
分析资源的释放条件
○ 读进程释放读写锁 当计数器rcount个数等于0释放 否则不释放
○ 写进程释放读写锁 直接释放即可
Reader(){
P(mutex);
if(rcount==0) P(rwlock);
++rcount;
V(mutex);
//read
P(mutex);
--rcount;
if(rcount==0) V(rwlock);
V(mutex);
}
Writer(){
P(rwlock);
//write;
V(rwlock);
}
2.扩展
1.限制读者个数
● 需要在进入读操作前设置一个读个数资源信号量max
Reader(){
P(mutex);
if(rcount==0) P(rwlock);
++rcount;
V(mutex);
P(max);
//read
V(max);
P(mutex);
--rcount;
if(rcount==0) V(rwlock);
V(mutex);
}
Writer(){
P(rwlock);
//write;
V(rwlock);
}
2.实现先来先服务
● 需要设置一个进出队列资源queue 初始为queue=1
Reader(){
P(queue);
P(mutex);
if(rcount==0) P(rwlock);
++rcount;
V(mutex);
//read
V(queue);
P(mutex);
--rcount;
if(rcount==0) V(rwlock);
V(mutex);
}
Writer(){
P(queue);
P(rwlock);
//write;
V(rwlock);
V(queue);
}