1. 程式人生 > >生產者消費者問題(程式碼實現)

生產者消費者問題(程式碼實現)

生產者-消費者問題(也被稱為有界緩衝器問題)是一個典型的例子多執行緒同步的問題。問題描述了兩個程序,生產者和消費者,誰都有一個共同的,固定大小的緩衝區作為一個佇列。製片人的工作是生成資料,把它放入緩衝區,並重新開始。同時,消費者在消費資料(即,從緩衝器中移除),一次一個塊。問題是確保生產者不會嘗試將資料新增到緩衝區,如果它的全部,而且消費者不會嘗試從空緩衝區刪除資料。

對生產者的解決方案是要麼去當緩衝區已滿睡覺或丟棄資料。下一次消費者從緩衝區中刪除一個專案,它會通知生產者,誰再次開始填充緩衝區。以同樣的方式,使用者可以進入休眠狀態,如果它發現該緩衝器是空的。下一次的生產者把資料放入緩衝器,它喚醒睡眠消費者。該溶液可以通過以下方式來達到的程序間通訊,通常使用的訊號量。一個不充分的解決方案可能會導致死鎖,其中兩個程序都在等待被喚醒。該問題也可推廣到具有多個生產者和消費者。

接下來,我們來實現一個一個程式,它是功能是開兩個執行緒,使一個數加到1W,也就是兩個執行緒各加五千次,首先,我寫出來以下程式:


然後,我們看看結果:


然而,我們並沒有得到我們想要的答案,這是為什麼呢?那我們先改變一下程式碼:


在看看結果:


在說這個程式,我們先來了解一個函式:



所以,我們接下來開始寫消費者和生產者問題;

但是,他們既要有互斥,也要有同步,怎麼實現同步呢?



所以,來看看結果:



所以,這樣便可以。

PS:(關於執行緒的其他問題,在本人前幾篇博文已經簡述過了)

在這裡,本人實現了一個消費者和一個生產者,如果換成多個消費者和多個生產者呢?

讀者可以思考一下。