讀者 寫者問題

2021-09-06 23:09:36 字數 2666 閱讀 5937

經典程序同步與互斥問題

讀者---寫者問題

1.問題描述

乙個資料物件若被多個併發程序所共享,且其中一些程序只要求讀該資料物件的內容,而另一些

程序則要求寫操作,對此,把只想讀的程序稱為「讀者」,而把要求寫的程序稱為「寫者」。在

讀者--寫著問題中,任何時刻要求「寫者」最多隻允許有乙個,而讀者則允許有多個。因為多個

讀者的行為互不干擾,他們只是讀資料,而不改變資料物件的內容,而寫者則不同,他們要改變資料物件的內容,如果他們同時操作,則資料物件的內容將會改變的不可知。所以對共享資源的讀寫操作的限制條件是:

1>允許任意多的讀程序同時讀;

2>一次只允許乙個寫程序寫操作;

3>如果有乙個寫程序正在進行寫操作,禁止任何讀程序進行讀操作。

2.用訊號量解決讀者--寫著問題

為了解決「寫著與寫著」和「寫著與第乙個讀者」的互斥問題即可,為此引入互斥訊號量wmutex。

為了記錄誰是第乙個讀者,可以用乙個全域性整型變數rcount做乙個計數器。而在解決問題的過程中,由於使用了全域性變數rcount,該變數又是乙個臨界資源,對於他的訪問仍需互斥進行,所以需要

乙個互斥訊號量rmutex。

3.思考問題

對於讀者---寫者問題,有以下三種策略。

1>讀者優先。即當讀者進行讀時,後續的寫者必須等待,直到所有的讀者均離開後,寫著才可進入。

2>寫者優先。即當乙個寫者到來時,只有那些已經獲得授權允許讀的程序才允許完成他們的操作,

寫者之後到來的讀者將被推遲,直到寫者完成。在該策略中,如果有乙個不可中斷的連續的寫者,

讀者程序會被無限期的推遲。

3>公平策略。以上兩種策略,讀者或寫程序中乙個對乙個有絕對的優先權,hoare提出了一種更公平

的策略,由如下規則定義。

規則1:在乙個讀序列中,如果有寫者在等待,那麼就不允許有新的讀者開始執行。

規則2:在乙個寫操作結束時,所有等待的讀者應該比下乙個寫者有更高的優先權。

對於公平策略,又如何解決呢?

#include #include 

#include

#include

#include

#include

int rcount=0,num=0; //

被保護的全域性變數

sem_t wmutex,rmutex,mutex;

void* read1(void *arg)

rcount=rcount+1;//

讀者數目

sem_post(&rmutex);

sem_post(&mutex);

printf(

"執行緒%lu正在進行讀資料%d\n

",pthread_self(),num);

sleep(1);

sem_wait(&rmutex);//

讀者閱讀結束

rcount=rcount-1;

if(rcount==0)//

所有的讀者閱讀結束

sem_post(&rmutex);}

void* write1(void *arg)

int main(int argc,char *argv)

i++;

}while(j<=4

)

j++;

}for(i=0;i<5;i++)

pthread_join(tid[i],null);

sem_destroy(&wmutex);

sem_destroy(&rmutex);

printf(

"程式執行結束\n");

return0;

}

寫者優先

#include #include 

#include

#include

#include

#include

int rcount=0,num=0; //

被保護的全域性變數

sem_t wmutex,rmutex;

void* read1(void *arg)

rcount=rcount+1;//

讀者數目

sem_post(&rmutex);

printf(

"執行緒%lu正在進行讀資料%d\n

",pthread_self(),num);

sleep(1);

sem_wait(&rmutex);//

讀者閱讀結束

rcount=rcount-1;

if(rcount==0)//

所有的讀者閱讀結束

sem_post(&rmutex);}

void* write1(void *arg)

int main(int argc,char *argv)

i++;

}while(j<=4

)

j++;

}for(i=0;i<5;i++)

pthread_join(tid[i],null);

sem_destroy(&wmutex);

sem_destroy(&rmutex);

printf(

"程式執行結束\n");

return0;

}

讀者優先

讀者寫者問題

生產者消費者問題一樣,讀者寫者也是乙個非常著名的同步問題。讀者寫者問題描述非常簡單,有乙個寫者很多讀者,多個讀者可以同時讀檔案,但寫者在寫檔案時不允許有讀者在讀檔案,同樣有讀者在讀檔案時寫者也不去能寫檔案。上面是讀者寫者問題示意圖,類似於生產者消費者問題的分析過程,首先來找找哪些是屬於 等待 情況。...

讀者寫者問題

問題簡述 讀者 寫者問題的讀寫操作限制 包括讀者優先和寫者優先 1 寫 寫互斥,即不能有兩個寫者同時進行寫操作。2 讀 寫互斥,即不能同時有乙個執行緒在讀,而另乙個執行緒在寫。3 讀 讀允許,即可以有乙個或多個讀者在讀。讀者優先的附加限制 如果乙個讀者申請進行讀操作時已有另乙個讀者正在進行讀操作,則...

讀者 寫者問題

讀者 寫者問題 讀者 寫者問題 readers writers problem 也是乙個經典的併發程式設計問題,是經常出現的一種同步問題。計算機系統中的資料 檔案 記錄 常被多個程序共享,但其中某些程序可能只要求讀資料 稱為讀者 reader 另一些程序則要求修改資料 稱為寫者 writer 就共享...