1樓:不染葉
生產者消費者問題(英語:producer-consumer problem),也稱有限緩衝問題(英語:bounded-buffer problem),是一個多執行緒同步問題的經典案例。
該問題描述了兩個共享固定大小緩衝區的執行緒——即所謂的「生產者」和「消費者」——在實際執行時會發生的問題。生產者的主要作用是生成一定量的資料放到緩衝區中,然後重複此過程。與此同時,消費者也在緩衝區消耗這些資料。
該問題的關鍵就是要保證生產者不會在緩衝區滿時加入資料,消費者也不會在緩衝區中空時消耗資料。
2樓:匿名使用者
如果將兩個wait操作即wait(full)和wait(mutex)互換位置,或者將signal(mutex)與signal(full)互換位置,當緩衝區存滿k件產品時。生產者又生產了一件產品,它欲向緩衝器存放時將在empty上等待,但它已經佔有了使用緩衝器的權利。這時消費者要取產品時將停留在mutex上得不到使用緩衝器的權利,導致生產者等待消費者取走產品,而消費者卻在等待生產者釋放使用緩衝器的權利,這種相互等待永遠結束不了。
因此程序將會發生死鎖。
3樓:騎卷平
帶我去姥姥家的蘋果園。三月花開。滿樹的蘋果花,潔白無瑕,一朵又一
有關生產者和消費者的問題,請高手指點...
4樓:老猿講程式設計
這是一個同步設計的問題:
public void run()
作業系統 關於生產者消費者的問題
5樓:狼狼bu乖
empty是資源訊號量,意思生產者、消費者都靠這個訊號量來進行生產、消費。
為什麼「生產者程序向n個緩衝區投滿產品後消費者程序才開始從中取產品」?
其實可以轉為問程序間為什麼需要同步、互斥?您對這問題的研究不夠請再看書。
這裡我和您舉個例子。
訊號量的目的是管理生產者、消費者對公共資源(緩衝區)的訪問
p原語對資源進行佔有,v原語對資源進行釋放
缺少empty資源訊號量,那麼只有互斥訊號量。
但是empty和full需要成對出現,就算缺少signal(empty),那麼消費者沒對empty訊號進行釋放,產生的結果只會是下次生產者想進去生產東西但因為訊號量缺失,進不去。
我也很想知道為什麼「生產者程序向n個緩衝區投滿產品後消費者程序才開始從中取產品」?
6樓:匿名使用者
消費者程序每次取產品時首先要wait(full)(full是指滿的緩衝區的數目),成功取完之後要signal(empty)給空緩衝區的數目加一個1,生產者每次先wait(empty),產生完後sigal(full),若缺少siganl(empty),生產者會讓empty 的數目會一直減少,直至empty的數目為0,即會表示n個緩衝區是滿的,而此時的full訊號量依然為初值a(假設a不為0)。此時只能執行消費程序。初值 empty=n-2 full=2
在這種情況下, 其變化 n-3 2n-4 2
…… 2
0 2
此時只有消費者程序執行 0 10 0
lz感覺答案說的不是太清楚,給訊號量empty 和 full 賦初值的不同很影響理解.
有關利用記錄型訊號量解決生產者消費者的問題?
7樓:吉祥長樂
有一群生產者程序在生產產品,並將這些產品提供給消費者程序去消費。為使生產者程序與消費者程序能併發執行,在兩者之間設定了一個具有n個緩衝區的緩衝池,生產者程序將其所生產的產品放入一個緩衝區中;消費者程序可從一個緩衝區中取走產品去消費。儘管所有的生產者程序和消費者程序都是以非同步方式執行的,但它們之間必須保持同步,既不允許消費者程序到一個空緩衝區去取產品,也不允許生產者程序向一個已裝滿產品且尚未被取走的緩衝區投放產品。
參考**:
int in = 0, out = 0;//in: 輸入指標, out: 輸出指標;
item buffer[n];//n個緩衝區組成的陣列;
semaphore mutex = 1, full = 0, empty = n;
//mutex: 互斥訊號量, 生產者程序和消費者程序都只能互斥訪問緩衝區;
//full: 資源訊號量, 滿緩衝區的數量;
//empty: 資源訊號量, 空緩衝區的數量;//訊號量不允許直接參與運算, 故都要定義;
//生產者程式;
void producer() while (true);
}//消費者程式;
void producer() while (true);
}注意:
生產者與消費者程序對資源訊號量的申請與釋放情況剛好相反(生產者是申請空,釋放滿;消費者是申請滿,釋放空)。
應先執行對資源訊號量的申請,然後再對互斥訊號量進行申請操作,否則會因起死鎖(如果先申請互斥訊號量再申請資源訊號量,則可能發生一個程序申請互斥訊號量成功,得到臨界資源,再申請資源訊號量失敗,導致該程序帶著臨界資源進入阻塞狀態,造成死鎖)。
生產者消費者問題
8樓:匿名使用者
關於 「每一行資料後面那些不等長的部分要怎麼讀入?」 , 最佳答案裡的實現個人感覺不好, 如果是我的話會我會用stringstream來讀,例子如下:
stringstream ss;
ss << "1 2 3 4";
int a;
while(ss >> a)
生產者名詞解釋,名詞解釋 生產者
生產者是能利用簡單的無機物合成有機物的自養生物或綠色植物。能夠通過光合作用把太陽能轉化為化學能,或通過化能合成作用,把無機物轉化為有機物不僅供給自身的發育生長,也為其他生物提供物質和能量,在生態系統中居於最重要地位。名詞解釋 生產者 兩個層面,一,企業法人,二,操作員工。名詞解釋 生產者剩餘 生產者...
硝化細菌是生產者還是消費者
是生產者,它把硝酸根離子轉化為硝酸.硝化細菌 包括兩個細菌亞群,一類是亞硝酸細菌 又稱氨氧化菌 將氨氧化成亞硝酸,另一類是硝酸細菌 又稱硝化細菌 將亞硝酸氧化成硝酸。這兩類菌能分別從以上氧化過程中獲得生長所需要的能量,但其能量利用率不高,故生長較緩慢,其平均代時 即細菌繁殖一代所需要的時間 在10小...
什麼是消費者關係,生產者和消費者之間的關係是什麼
所謂消費者關係是指企業與其產品和服務的現實的和潛在的消費者之間所結成的社會聯絡。消費者關係是現代企業公共關係的重要組成部分,其特定的含義是指企業與其產品和服務的現實的 潛在的消費者之間所結成的社會聯絡。消費者關係是組織外部公共關係中最重要的一類。因為一般說來,組織自身目標的最終實現與否就直接取決於它...