一、問題描述
要求:
1、允許多個讀者可以同時對文件執行讀操作。
2、只允許一個寫者往文件中寫信息。
3、任一寫者在完成寫操作之前不允許其他讀者或寫者工作。
4、寫者執行寫操作前,應讓已有的讀者和寫者全部退出。
二、問題分析
讀者寫者問題最核心的問題是如何處理多個讀者可以同時對文件的讀操作。
三、如何實現
semaphore rw = 1; //實現對文件的互斥訪問 int count = 0; semaphore mutex = 1;//實現對count變量的互斥訪問 int i = 0; writer(){ while(1){ P(rw); //寫之前“加鎖” 寫文件 V(rw); //寫之后“解鎖” } } reader (){ while(1){ P(mutex); //各讀進程互斥訪問count if(count==0) //第一個讀進程負責“加鎖” { P(rw); } count++; //訪問文件的進程數+1 V(mutex); 讀文件 P(mutex); //各讀進程互斥訪問count count--; //訪問文件的進程數-1 if(count==0) //最后一個讀進程負責“解鎖” { V(rw); } V(mutex); } }
只要有源源不斷的讀進程存在,寫進程就要一直阻塞等待,可能會造成“餓死”,在上述的算法中,讀進程是優先的,那么應該怎么樣來改造呢?
新加入一個鎖變量w,用於實現“寫優先”!
這里我們來分析一下讀者1->寫者1->讀者2這種情況。第一個讀者1在進行到讀文件操作的時候,有一個寫者1操作,由於第一個讀者1執行了V(w),所以寫者1不會阻塞在P(w),但由於第一個讀者1執行了P(rw)但沒有執行V(rw),寫者1將會被阻塞在P(rw)上,這時候再有一個讀者2,由於前面的寫者1進程執行了P(w)但沒有執行V(w),所以讀者2將會被阻塞在P(w)上,這樣寫者1和讀者2都將阻塞,只有當讀者1結束時執行V(rw),此時寫者1才能夠繼續執行直到執行V(w),讀者2也將能夠執行下去。
基操勿6。
該算法是一種先到先服務的算法,對讀寫操作相對公平。
四、總結