盘一盘读者、写者问题
1.问题描述
若干读者、若干写者,一个共享文件
多个读进程可以看同一共享位置
问题:
- 读写不能同时锁定同一共享位置
- 两个写进程不能同时访问同一共享位置
2.设计思想
设置了 count计数器 ,用于解决 多个读者 可以同时访问,只有最后个读者 释放信号量后,写者可以继续写入。
3.解决方案
读写公平法
信号量
semaphore rw = 1; // 实现文件互斥访问
int count = 0; // 记录 有几个读进程 在访问文件
semaphore mutext = 1; // 对count 互斥访问
semaphore w = 1; // 实现“写优先”
写者
writer(){
while(1){
P(w); // 避免 写者 饿死情况出现
p(rw);
写文件
V(rw);
V(w);
}
}
读者
reader(1){
while(1){
P(w);
P(mutex);
if(count == 0)
P(rw); // 锁住当前位置 写者不能 访问这一块位置
count++; // 增加 读者的数量
V(mutex);
V(w);
读文件
P(mutex);
count--; // 减少 读者的数量
if(count == 0)
V(rw); // 释放 当前共享位置 写者可以访问 此位置了
V(mutex);
}
}