读者---写者问题

 问题描述:

一个数据文件或记录可被多个进程共享,我们把只要求读该文件的进程称为: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);         //释放数据区,允许其他进程读写;




猜你喜欢

转载自blog.csdn.net/wyf2017/article/details/79726678