若干程序通過有限的共享緩衝區交換資料。其中,「生產者」程序不斷寫入,而「消費者」程序不斷讀出;共享緩衝區共有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 表示為訊號量加一,表示釋放了當前訊號量所指代的資源。兩者都是原子操作,不可打斷。生產者不停的向訊息佇列中生產訊息,消費者則不停的從訊息佇列中獲取訊息。當訊息佇列滿時,生產者...