經典程序的同步問題

2021-09-27 04:01:31 字數 1496 閱讀 4005

若干程序通過有限的共享緩衝區交換資料。其中,「生產者」程序不斷寫入,而「消費者」程序不斷讀出;共享緩衝區共有n個;任何時刻只能有乙個程序.可對共享緩衝區進行操作。

1)在訪問公共緩衝區的時候,程序之間是互斥的

2)當緩衝區為空時,「消費者」程序不能讀出

3)當緩衝區為滿時,「生產者」程序不能寫入

semaphore  full=0;     	//滿緩衝區單元個數

semaphore empty=n; //空緩衝區單元個數

semaphore mutex=1; //互斥訊號量:控制對臨界資源的訪問

char buffer[n];

int in=0,out=0;

char nextc,nextp;

void producer() //生產者程序

while(true);

}void consumer() //消費者程序

while(true);

}//主程式執行

void main()

有五個哲學家公用一張圓桌,分別坐在周圍的五張椅子上,在圓桌上有五個碗和五支筷子,他們的生活方式是交替地進行思考和快餐,平時,乙個哲學家進行思考,飢餓時便試圖取用其左右最靠近他的筷子,只有他拿到兩隻筷子時才能進餐

臨界資源:筷子

1)最多允許四個哲學家同時進餐

2)僅當哲學家的左、右兩隻筷子均可用,才允許他進餐。

3)規定奇數號哲學家先拿他左邊的筷子,然後再去拿他右邊的筷子;而偶數號哲學家則相反。

確認這些都不被違背,以保證至少乙個哲學家能夠進餐,最終釋放出他所使用過的筷子,從而使得更多的哲學家進餐。

semaphore chopstick[5]= ;

dowhile(true);

乙個資料物件(資料檔案或記錄),可以被多個程序共享。其中有些程序要讀,有些要寫或修改。

允許多個讀者程序同時讀乙個共享物件,但不允許乙個寫者程序和其它讀者或寫者程序同時訪問共享物件。

1)讀程序和寫程序之間是互斥的

2)讀程序和讀程序之間是非互斥的

3)寫程序和寫程序之間是互斥的

//保證多個讀,有人寫的時候不能讀

reader

swait(l,1,1 );

swait( mx,1,0); //有著開關的作用①

read;

ssignal(l,1)

//有人讀時不能寫,並與寫互斥

writer

swait(mx,1,1;l,rn,0); //②

write;

ssignal(mx,1)

① 只要無write程序進入寫操作,mx=1,reader程序就都可以進行讀操作,若mx=0,則不可以。

②表示讀程序和寫程序都沒有的時候,write程序才可以進入臨界區

經典程序的同步問題

五個哲學家共用一張圓桌,分別坐在周圍的五張椅子上,在桌子上有五隻碗和五隻筷子,他們的生活方式是交替地進行思考和進餐。平時,乙個哲學家進行思考,飢餓時便試圖取用其左右最靠近他的筷子,只有在他拿到兩隻筷子時才能進餐。進餐畢,放下筷子繼續思考。放在桌子上的筷子時臨界資源,在一段時間內只允許一位哲學家使用,...

經典程序同步問題

文章出處 http heikediguo2005.blog.163.com blog static 2211971200910254235533 依據訊號量與程序的關係,我們可把程序中使訊號量分成私用訊號量和公用訊號量。私有訊號量是指只與制約程序和被制約程序有關的訊號量 公用訊號量是指與一組併發程序...

經典程序同步問題

wait表示為訊號量減一,當訊號量不夠減時 訊號量 0 時 說明當前資源不足,發出資源請求的程序阻塞直到資源可達。signal 表示為訊號量加一,表示釋放了當前訊號量所指代的資源。兩者都是原子操作,不可打斷。生產者不停的向訊息佇列中生產訊息,消費者則不停的從訊息佇列中獲取訊息。當訊息佇列滿時,生產者...