一、读者优先
问题描述
有读进程和写进程两组并发进程,共享一个文件,当两个或两个以上读进程同时访问共享数据时,不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能会导致数据不一致的错误。因此要求:1.允许多个读者可以同时对文件执行操作;2.只允许一个写者往文件中写入信息;3.任意一个写者在完成操作前不允许其他读者或写者工作;4.写者执行操作前,必须等已有的读者或写者全部退出。
关系分析
两类进程:读进程和写进程。
1.读者和写者是互斥的;
2.写者和写者是互斥的;
3.需要用一个计数器来记录是否有读者在读文件。
代码
semaphore rw = 1; //互斥访问文件
int count = 0; //记录有几个读者在访问文件
semaphore r = 1; //对count变量互斥访问
writer(){
while(true){
P(rw); //互斥访问文件
writing;
v(rw);
}
}
reader(){
while(true){
P(r); //对count变量互斥访问
if(count == 0){
//如果是第一个读者,则需要阻止其他写者对文件的访问
P(rw);
}
count++;
V(r);
reading;
P(r);
count--;
if(count == 1){
V(rw);
}
V(r);
}
}
注意
1.上面的算法是读进程优先的,也就是说有一个读进程在读文件,写进程就会被延迟,并且随后而来的读进程都被允许读文件,这样会导致写进程长时间等待,会产生“饥饿”现象。