读写者问题

int readcount, writecount = 0;    //readcount,writecount都等于0
semaphore rsem, wsem = 1;      // rsem,wsem都等于1
semaphore x,y,z = 1;                   // xyz都等于1
  
void reader(){ 
    while(1){ 
      wait(z);                    //用来保证写者优先.
       wait(rsem);             //判断有没有写进程在临界区,有的话等待,没有的话不让新的写进程进来..由于wait(z)保证在这里最多只有1个读者
        wait(x);                   //开始对readcount的互斥访问
         readcount++;           //更新读进程数量
         if (readcount==1)
              wait(wsem);       //第一个读进程需要判断是否有写进程在进行写操作,有的话需要等待,没有的话不让写进程进行新写操作.这里也会导致读者阻塞.
        signal(x);                //结束对readcount的互斥访问
       signal(rsem);          //归还锁,让写进程可以进临界区
      signal(z); 
      doReading(); 
      wait(x);                    //开始对readcount的互斥访问
         readcount--;         //更新读进程数量
         if (readcount==0) 
              signal(wsem);      //最后一个离开临界区的读进程需要归还锁,让写进程可以进行写操作
      signal(x);                  //结束对readcount的互斥访问
    } 
} 
  
         
  
void writer(){ 
   while(1){ 
       wait(y);                //开始对writecount的互斥访问
         writecount++;           //更新写进程数量
         if (writecount==1)  
              wait(rsem);            //第一个写进程需要判断是否有读进程在临界区,有的话需要等待,没有的话不让新的读进程进来
       signal(y);               //结束对writecount的互斥访问
       wait(wsem);            //限制同一时刻只能有一个写进程进行写操作
       doWriting(); 
       signal(wsem);         //结束对写操作的限制
       wait(y);                 //开始对writecount的互斥访问
         writecount--;            //更新写进程数量
         if (writecount==0) 
              signal(rsem);      //最后一个离开临界区的写进程需要归还锁,让读进程可以进临界区
       signal(y);                //结束对writecount的互斥访问
    } 
}

原文地址:https://www.cnblogs.com/hankskfc/p/1898106.html