在學習程序互斥中,有個著名的問題:生產者-消費者問題。
這個問題是乙個標準的、著名的同時性程式設計問題的集合:乙個有限緩衝區和兩類執行緒,
它們是生產者和消費者,生產者把產品放入緩衝區,相反消費者便是從緩衝區中拿走產品。
生產者在緩衝區滿時必須等待,直到緩衝區有空間才繼續生產。消費者在緩衝區空時必
須等待,直到緩衝區中有產品才能繼續讀取。
在這個問題上主要考慮的是:緩衝區滿或緩衝區空以及競爭條件(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提出,用以演示他提出的訊號量機制。在同乙個程序位址空間內執行的兩個執行緒生產者執行緒生產物品,然後將物品放置在乙個空緩衝區中供消費者執行緒消費。消費者執行緒從緩衝區中獲得物品,然後釋放緩衝區。當生產者執行緒生產物品時,如果沒有...