用信號量實現互斥併發
Var mutex:semaphoer:=1; Begin Parbegin Process1:begin //第一個進程 repeat wait(mutex); critical section signal(mutex); remainder section until false; end; Process2:begin //第二個進程 repeat wait(mutex); //申請資源 critical section //使用臨界區 singal(mutex); //釋放資源 remainder section //剩餘區代碼 until false; end Parend
一組生產者進程生產產品給一組消費者進程消費。爲使他們併發執行,設一個有n個緩衝區的緩衝池,生產者一次向一個緩衝區中投入消息,消費者從一個緩衝區中取得消息。生產者——消費者問題其實是相互合做進程關係的一種抽象。code
var mutex:semaphore:=1; empty:semaphore:=n; full:semaphore:=0; buffer:array[0,1,……,n-1] of item; //生產者生產出來的一個數據就是item in,out:integer:=0,0; //in記錄放入數據的地址,out記錄取出數據的地址,其實就是buffer下標
生產者進程:進程
Procedure:begin repeat …… procedure an item nextp; //生產一個數據(下一個) …… wait(empty); //申請一個空緩衝區,申請成功,empty信號量減1 wait(mutex); Buffer(in):=nextp; //將nextp放入下標是in的緩衝區中 in:=(in+1) mod n; singal(mutex); //釋放緩衝區 singal(full); //將full信號量加1 until false; end;
消費者進程資源
consumer:begin repeat wait(full); //申請一個緩衝區 wait(mutex); //含義是判斷當前有沒有生產者在使用申請的緩衝區 nextc:=Buffer(out); out:=(out+1) mod n; singal(mutex); singal(empty); //釋放一個空緩衝區,empty加1 Consumer the item in nextc; until false; end;