嘖。這幾個月在肝GPA,沒有好好研究代碼,最近期末重新看操作系統,覺得這個問題非常有趣。
題目不用說了。
前提:
可以允許多個讀者讀,但是只有一個寫者寫。
寫者優先:在有讀者讀的時候,除非讀者是在臨界區內正在讀,否則在任何剩余時間寫者都應該能夠搶奪讀者。
而要盡量保證寫者寫的時候,讀者不能搶奪寫者的訪問權。
int readerCount = 0, writerCount = 0; semaphore x(1),y(1),z(1),rsem(1),wsem(1); //reader void reader() { while(true){ wait(z);// z 保證在writer處於critical section時,只有一個reader被堵在了rsem上,其余的reader被堵在了z上,這使得,當一個reader獲得了rsem在它處於critical section時,若此時來了一個writer,這個writer只需要等待這一個reader結束然后可以搶占,若沒有z,該writer可能要與多個reader搶占訪問權 wait(rsem); // rsem writer能夠搶占reader的訪問權 wait(x); // x 只用來確保readerCount的原子性操作 readerCount++; if(readerCount == 1) wait(wsem);// 在有讀者在critical section中讀時,防止此時有writer要修改critical section中的數據 signal(x); signal(rsem); signal(z); READ(); wait(x); readerCount--; if(readerCount == 0) signal(wsem); // readerCount是此時critical section中的reader的數量,要保證critical section中的所有的reader全部讀完離開之后,才能允許writer進入寫數據 signal(x); } } //writer void writer() { while(true){ wait(y);// y用來保證writerCount 的原子性操作 writerCount++; if(writerCount == 1) wait(rsem); // 防止此時reader進入讀數據 signal(y); wait(wsem); // 此時只要搶占讀者的或上一個寫者的訪問權 WRITE(); signal(wsem); wait(y); writerCount--; if(writerCount == 0) signal(rsem); // 只有所有寫者全部寫完,才允許讀者進行讀 signal(y); } }