读者-写者问题3-写者优先

//写者优先 
int wcount = 0;  //用于记录写者数量 
int rcount = 0;   //用于记录读者数量
semaphore rmutex = 1;   //用于读者进程互斥修改rcount
semaphore wmutex = 1;   //用于写者进程互斥修改wcount
semaphore file = 1;    //用于读者写者互斥访问file 
semphore  read = 1;     //用于阻塞读者进程,实现写者优先 

writer()
{
    P(wmutex);
    if(wcount == 0)
        P(read);
    wcount++;
    V(wmutex);    
    
    P(file);     //写者互斥访问文件 
    do_writing();
    V(file);
    
    P(wmutex)
    wcount--;
    if(wcount == 0)
        V(read);
    V(wmutex);

reader()
{
    P(read);     //检查写者队列是否为空。 
    P(rmutex);
    if(rcount == 0)
        P(file);   //申请文件资源 
    rcount++;
    V(rmutex);
    V(read); 
    
    do_reading();
    
    P(rmutex);
    rcount--;
    if(rcount == 0)
        V(file);
    V(rmutex);    
}

/*注意这里read的作用,开始有多个读者到来开始读file,它们全部进入读者队列,此时来了一个写者,执行了P(read)之后,后续到了的读者由于阻塞在read上,都不能再进入读者队列,而写者到来,则可以全部进入写者队列,因此保证了
写者优先,同时第一个写者读者执行了P(read)之后,也不能马上开始写,必须等到所有进入读者队列的读者都执行完
读操作(由于此时后续到来的读者阻塞在read上,因此读者队列数目会逐渐减少到0),通过V(file)通知写者可以
开始写操作 
*/ 

猜你喜欢

转载自blog.csdn.net/mch2869253130/article/details/84320971