1 、利用記錄型信號量解決生產者——消費者問題spa
假定在生產者和消費者之間的公用緩衝池,具備n個緩衝區,這時可利用互斥信號量mutex實現諸進程對緩衝池的互斥使用。利用信號量empty和full分別表示緩衝池中空緩衝區和滿緩衝區的數量。只要緩衝區未滿生產者即可將消息送入緩衝區,只要緩衝區未空消費者即可從緩衝區取走一個消息。指針
1 Var mutex,empty,full:semapthore:=1,n,0; // 聲明互斥信號量mutex=1,n個空緩衝區,滿緩衝區個數爲0 2 buffer:array[0,1,...,n-1] of item; 3 in,out:integer:=0,0; // 輸入、輸出指針 4 begin 5 parbegin 6 proceducer:begin 7 repeat 8 ... 9 proceducer an item nextp; // 生產一個產品 10 ... 11 wait(empty); // 申請一個空緩衝區 12 wait(mutex); // 申請一個臨界資源使用權 13 buffer(in):=nextp;// 將產品放入緩衝池中 14 in:=(in+1) mod n; // 輸入指針向前移一個位置 15 signal(mutex); // 釋放臨界資源 16 signal(full); // 釋放一個滿緩衝區 17 until false; 18 end 19 consumer:begin 20 repeat 21 wait(full); // 申請一個滿緩衝區 22 wait(mutex); // 申請一個臨界資源使用權 23 nextc:=buffer(out); // 從緩衝池取走一個產品 24 out:=(out+1) mod n; // 輸出指針向前移一個位置 25 signal(mutex); // 釋放臨界資源 26 signal(empty); // 釋放一個空緩衝區 27 consumer the item in nextc; 28 until false 29 end 30 parend 31 end
二、利用AND信號量解決生產者——消費者問題(看懂了上面的詳細分析,下面的僞代碼就容易理解多了)code
1 Var mutex,empty,full:semapthore:=1,n,0; 2 buffer:array[0,...,n-1] of item; 3 in out:integer:=0,0; 4 begin 5 parbegin 6 proceducer:begin 7 repeat 8 ... 9 proceduce an item in nextp; 10 ... 11 Swait(empty,mutex); // 同時申請一個空緩衝區和臨界資源使用權 12 buffer(in):=nextp; 13 in:=(in+1)mod n; 14 Ssignal(mutex,full); // 同時釋放一個臨界資源和滿緩衝區 15 until false 16 end 17 consumer:begin 18 repeat 19 Swait(full,mutex); 20 Nextc:=buffer(out); 21 Out:=(out+1)mod n; 22 Ssignal(mutex,empty); 23 consumer the item in nextc; 24 until false; 25 end 26 parend 27 end