參考博客:https://blog.csdn.net/c1194758555/article/details/52805918
https://www.cnblogs.com/wkfvawl/p/11538431.html
問題描述
不允許Write進程和Read進程或其他Write進程同時訪問文件,Read進程可以和其他Read進程同時訪問。
分為三種類型。
讀者優先
要求:
1.多個讀者可以同時訪問文件
2.同一時間只允許一個寫者訪問文件
3.讀者和寫者進程互斥
解決方法:
用一個readcounter記錄是第幾個讀者在讀,如果是第一個讀者,則不能讓寫者寫,需要一個鎖。因為readcounter是臨界資源,也需要一個互斥量。
semaphore rc_mutex = 1, wmutex = 1;
readcounter = 0;
void writer{
do{
wait(wmutex);
//write
signal(wmutex);
}while(TRUE);
}
void reader{
do{
wait(rc_mutex);
if(readcounter == 0) wait(wmutex);
readcounter ++;
signal(rc_mutex);
// read
wait(rc_mutex);
readcounter --;
if(!readcounter) signal(wmutex);
signal(rc_mutex);
}while(TRUE);
}
寫者優先
要求:
1.讀者寫者互斥
2.寫者讀者同時等待時,所有等待的寫者優先,等所有寫者結束后,讀者才能讀
3.沒有寫者時,讀者能同時讀
4.寫者到來時,不會終止已經進行的讀者操作
解決方法:
semaphore rc_mutex = 1, wmutex = 1;
semaphore wc_mutex = 1, prior = 1; //寫者計數器,優先信號量
readcounter = 0, writercounter = 0;
void writer{
do{
wait(wc_mutex); //申請更改wc的權限
if(writercounter == 0) //如果是第一個寫者,就申請優先權限
wait(prior);
writercounter ++;
signal(wc_mutex);
wait(wmutex);
//write
signal(wmutex);
wait(wc_mutex);
writercounter --;
if(!writercounter)
signal(prior); //當最后一個寫者操作完成后,釋放優先級權限
signal(wc_mutex);
}while(TRUE);
}
void reader{
do{
wait(prior); //先申請優先級權限,如果前面還有寫者就等待
wait(rc_mutex);
if(readcounter == 0) wait(wmutex);
readcounter ++;
signal(rc_mutex);
signal(prior); //釋放優先級權限
// read
wait(rc_mutex);
readcounter --;
if(!readcounter) signal(wmutex);
signal(rc_mutex);
}while(TRUE);
}
讀寫均等
semaphore rc_mutex = 1, wmutex = 1;
semaphore prior = 1; //讀者和寫者都等待在一個隊列上,實現讀寫均等
readcounter = 0, writercounter = 0;
void writer{
do{
wait(prior);
wait(wmutex);
//write
signal(wmutex);
signal(prior);
}while(TRUE);
}
void reader{
do{
wait(prior);
wait(rc_mutex);
if(readcounter == 0) wait(wmutex);
readcounter ++;
signal(rc_mutex);
signal(prior);
//read
wait(rc_mutex);
readcounter --;
if(!readcounter) signal(wmutex);
signal(rc_mutex);
}while(TRUE);
}
有錯誤請指出!