读者-写者问题2-公平竞争(说的很明白)

首先要明确一下:

1.读者到达,并不能立马进入读者队列

2.这里的公平指的是读者和写者有相同的访问file的优先级,即写者和读者是按照到达的先后顺序访问file的。

2.若读者队列不为空,此时到达的写者进程必须等待读者队列中的读者进程全部结束后才可开始写操作,

 

//公平竞争
int rcount = 0;
semaphore rmutex = 1;   //用于读者进程互斥修改rcount;
semaphore file = 1;     //用于读者和写者互斥访问文件 
semaphore flag = 1;     //用于实现公平竞争 

writer()
{
    P(flag);
    P(file);
    do_writing;
    V(file);
    V(flag); 
}

reader()
{
    P(flag);
    P(rmutex);
    if(rcount == 0)
        P(file);
    rcount++;
    V(rmutex);
    V(flag);
    
    do_reading;
    
    P(rmutex);
    rcount--
    if(rcount == 0)
        V(file);
    V(rmutex);    
}

/*
看完代码不知你是否有这样的疑问,为什么加了一个信号量flag,就实现了公平竞争?

       对比上一篇读者优先,可以发现,读者优先中只要后续有读者进程到达,读者进程就可以进入读者队列, 而写者进程必须等待,直到没有读者到达,没有读者到达会导致读者队列为空,即rcount==0,此时写者才可以进入临界区执行写操作。
       而这里flag的作用就是阻止读者进程的这种特殊权限(特殊权限即只要读者进程到达,就可以进入读者队列)。 比如:开始来了一些读者进程读file,它们全部进入读者队列,此时来了一个写者,执行P(falg)操作,使得后续到来的读者都阻塞在flag上,不能进入读者队列(这会使得读者队列逐渐为空,即rcount减为0),这个写者也不能立马开始写(因为此时读者队列不为空),阻塞在file上,读者队列中的读者全部读取结束后,最后一个读者进程执行V(file),唤醒刚才的写者,写者开始进行写操作。 
*/ 

你可能感兴趣的:(operate,system)