有读者写者两组并发进程,共享一个文件,当两个或以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程同时访问共享数据时则可能导致数据不一致的错误,因此,要求:
- 允许多个读者可以同时对文件执行读操作
- 只允许一个写者往文件中写信息
- 任意写者完成写操作之前不允许其他读者或写者工作
- 写者执行写操作之前,应该让已有的读者和写者全部退出
下面算法是读进程优先的,因为可能会导致写进程饥饿
//用于实现对共享文件的互斥访问
seamaphore rw =1;
//记录当前有几个读进程在访问文件
int count = 0;
//由于对count的访问也是不确定的,所以也要设置信号量来对count进行互斥访问
seamaphore mutex =1;
//为了解决写进程可能会饿死的问题,新设置一个信号量,用于实现写优先
seamphore w = 1;
write(){
while(1){
P(w);
P(rw);//写操作之前先上锁
写文件操作
V(rw);//写完之后解锁
V(w);
}
}
reader(){
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);
}
}