问题描述:
一个数据文件或记录可被多个进程共享,我们把只要求读该文件的进程称为:Reader进程,其他进程称为Writer进程。允许多个文件同时读一个共享对象,因为读操作不会使数据文件混乱。但不允许一个Writer进程和其他Reader进程或Writer进程同时访问共享对象,否则会引起混乱。
解决方案:
1.利用记录型信号量解决读者-写者问题
为实现Reader与Writer进程间在读或写时的互斥二设置一个互斥信号量wmutex。另外,在设置一个整形变量readcount表示正在读的进程数目。由于只要有一个Reader进程在读,便不允许Writer进程去写。因此,仅当readcount=0,表示尚无Reader进程在读时,Reader进程才需要执行wait(wmutex)操作。若wait(wmutex)操作成功,Reader 进程便去读,相应的做readcount+1操作。听力,仅当Reader进程执行了Readercount-1操作后之为0,才执行signal(wmutex),以便让Writer进程写操作。又因为readcount是一个可被多个Reader进程访问的临界资源,因此,也应该为它设置一个互斥信号量rmutex。
2.问题描述代码如下
semaphore rmutex=1; //初始化信号量rmutex,保证对于readcount的互斥访问
semaphore mutex=1; //初始化信号量mutex,保证对于数据区的写互斥
int readcount=0; //用于记录读者数量,初值为0
reader(){
while(true){
wait(rmutex); //申请readcount的使用权
if(readcount==0) wait(wmutex); //如果此为第一个读者,阻止写者进入
readcount++; //读者数量加1
signal(rmutex); //释放readcount的使用权,允许其他读者使用——————疑问2
进行读操作;
wait(rmutex); //申请readcount的使用权,要对其进行操作
readcount--; //读者数量减一
if(readcount==0)signal(wmutex); //若没读者了,则允许写者进入
signal(rmutex); //释放readcount的使用权,允许其他读者使用
}
}
writer(){
while(true){
wait(wmutex); //申请对数据区进行访问
进行写操作;
signal(wmutex); //释放数据区,允许其他进程读写;