讀者-寫者問題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),喚醒剛才的寫者,寫者開始進行寫操作。
*/