有讀者寫者兩組併發進程,共享一個文件,當兩個或以上的讀進程同時訪問共享數據時不會產生副作用,但若某個寫進程和其他進程同時訪問共享數據時則可能導致數據不一致的錯誤,因此,要求:
- 允許多個讀者可以同時對文件執行讀操作
- 只允許一個寫者往文件中寫信息
- 任意寫者完成寫操作之前不允許其他讀者或寫者工作
- 寫者執行寫操作之前,應該讓已有的讀者和寫者全部退出
下面算法是讀進程優先的,因爲可能會導致寫進程飢餓
//用於實現對共享文件的互斥訪問
seamaphore rw =1;
//記錄當前有幾個讀進程在訪問文件
int count = 0;
//由於對count的訪問也是不確定的,所以也要設置信號量來對count進行互斥訪問
seamaphore mutex =1;
//爲了解決寫進程可能會餓死的問題,新設置一個信號量,用於實現寫優先
seamphore w = 1;
write(){
while(1){
P(w);
P(rw);//寫操作之前先上鎖
寫文件操作
V(rw);//寫完之後解鎖
V(w);
}
}
reader(){
while(1){
P(w);
P(mutex);
if(count==0)//由第一個讀進程來進行上鎖操作
P(rw);
count++;//統計讀進程數量
V(mutex);
V(w);
讀文件
P(mutex);
count--;
if(count==0)//由最後一個讀進程來進行解鎖
V(rw);
V(mutex);
}
}