生產者 消費者問題

2021-03-31 08:56:59 字數 1121 閱讀 5504

在學習程序互斥中,有個著名的問題:生產者-消費者問題。

這個問題是乙個標準的、著名的同時性程式設計問題的集合:乙個有限緩衝區和兩類執行緒,

它們是生產者和消費者,生產者把產品放入緩衝區,相反消費者便是從緩衝區中拿走產品。

生產者在緩衝區滿時必須等待,直到緩衝區有空間才繼續生產。消費者在緩衝區空時必

須等待,直到緩衝區中有產品才能繼續讀取。

在這個問題上主要考慮的是:緩衝區滿或緩衝區空以及競爭條件(race condition)。以下

是乙個含競爭條件的生產者-消費者問題例項。

#define n 100            /*number of slots in the buffer*/

int count=0;               /*number of items in the buffer*/

void producer(void)

}void ***sumer(void)

}在這個例項中,首先定義了乙個大小為100的公共緩衝區,也就是臨界資源,然後的count

便是緩衝區中產品的數目,初始化為0。producer函式是生產者函式,produce_item(&item

);是指生產者生產出來乙個產品,但是這時候並沒有對緩衝區進行操作。而if (count==n)

sleep();是測試語句,如果生產出來的產品數和緩衝區大小相等時,生產者就進入睡眠狀態

。如果不等,產品就放入緩衝區內,並且產品數增加1。if (count==1) wakeup(consumer);

這條語句看上去讓人十分費解,其實它的意思是,如果上一次操作時產品的數目為0,消費

者已經進入了睡眠狀態,而現在生產者又生產出來乙個產品,緩衝區內不為空,這時把消費

者喚醒。消費者函式也是同樣的道理,只不過乙個是取,另乙個是放。

我們可以看到,這裡存在潛在的競爭條件,所謂競爭條件就是這樣一種情況:多個執行緒對

資料產生的作用要依賴於執行緒的排程順序的。當兩個執行緒競相訪問同一資料時,就會發生競

爭條件。由於時間片的原因,乙個執行緒可以在任意乙個時刻打斷其他執行緒,因此資料可能會

被破壞或者被錯誤地解釋。在這個例項上反應的結果是,生產者和消費者兩個程序都永遠睡

眠。至於有哪些解決方案,以後再慢慢討論。 

生產者消費者問題

public class producer consumer class godown public godown int num public synchronized void produce int n catch interruptedexception e curr num n syste...

生產者 消費者問題

1 程序互斥問題 緩衝區b是臨界資源,程序p和c不能同時對b進行操作,即只能互斥的操作 2 程序同步問題 p不能往 滿 的的緩衝區b放產品,c不能從空的緩衝區獲得產品。當緩衝區滿時,c必須先於p執行,當緩衝區空時,p必須先於c執行 我們給出如下基於記錄型 二元 訊號量機制的解法 10 9 2013 ...

生產者 消費者問題

生產者 消費者問題是乙個經典的 程序同步問題,該問題最早由dijkstra提出,用以演示他提出的訊號量機制。在同乙個程序位址空間內執行的兩個執行緒生產者執行緒生產物品,然後將物品放置在乙個空緩衝區中供消費者執行緒消費。消費者執行緒從緩衝區中獲得物品,然後釋放緩衝區。當生產者執行緒生產物品時,如果沒有...