1. 程式人生 > >深入理解生產者與消費者問題

深入理解生產者與消費者問題

緩衝區的形象理解: 緩衝區好像使用一條傳送帶替代托架,傳送帶上一次可以放多個產品。 生產者在緩衝區尾加入資料,消費者在緩衝區頭讀取資料。緩衝區滿時,緩衝區上鎖並等待消費者執行緒讀取資料; 每一個生產或消費動作使得傳送帶向前移動一個單位。因此,消費者讀取資料的順序與資料產生順序相同。

引入一個count計數器表示已經被使用的緩衝區數量。

hNotEmptyEvent 和 hNotFullEvent來同步生產者和消費者執行緒。

每當生產者執行緒發現緩衝區滿(count = BufferSize) 它就等待hNotEmptyEvent事件。

同理,當消費者執行緒發現緩衝區空,就開始等待hNotEmptyEvent。

生產者執行緒寫入一個新的資料後,立刻發出hNotEmptyEvent來喚醒正在等待的消費者執行緒;

消費者執行緒在讀取一個數據之後,就發出hNotFullEvent來喚醒正在等待的生產者執行緒。

程式設計的思想: ①設定while 迴圈 pi生產者訪問臨界區,得到許可權訪問緩衝區,如果緩衝區滿,則等待。 ②直到緩衝區非滿,訪問互斥鎖,當得到互斥鎖且緩衝區非滿時,跳出while迴圈,開始生產新的資料,並把資料存放在Buffer緩衝區中,當資料存放結束則結束臨界區;接著喚醒消費者執行緒; ?ci消費者訪問臨界區,得到許可權訪問緩衝區,如果緩衝區尾空,則沒有可以處理的資料,則釋放互斥鎖且等待,直到緩衝區非空; ④緩衝區非空時,跳出while迴圈;

?消費者獲得資料,並根據所獲得的資料按類別消費。處理完資料後,結束臨界區;接著喚醒生產者執行緒。