經典進程的同步問題之——生產者&&消費者

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
相關文章
相關標籤/搜索