經典進程同步問題之生產者消費者問題
什么是生產者消費者問題
學術性描述:生產者-消費者(producer-consumer)問題是一個著名的進程同步問題。它描述的是:有一群生產者進程在生產產品,並將這些產品提供給消費者進程去消費。為使生產者進程與消費者進程能並發執行,在兩者之間設置了一個具有n 個緩沖區的緩沖池,生產者進程將它所生產的產品放入一個緩沖區中;消費者進程可從一個緩沖區中取走產品去消費。盡管所有的生產者進程和消費者進程都是以異步方式運行的,但它們之間必須保持同步,即不允許消費者進程到一個空緩沖區去取產品,也不允許生產者進程向一個已裝滿產品且尚未被取走的緩沖區中投放產品。其大概結構圖如下:
通俗描述:生產者-消費者問題在生活中實際上有許多例子,比如吃自助餐的過程,由於由於桌子上擺放食物的空間是有限的,因此當廚師用食物將桌子擺滿之后就不能再放了,要等到有顧客來取走食物余出空間之后才能夠繼續擺放食物。而顧客在取食物的過程中也不是說可以無限去取的,當桌子上沒有食物的時候,顧客顯然是無法獲得食物,此時他需要等待,等着廚師把食物放到桌子上之后,才能繼續取。這整個過程其實就是一個生產者-消費者問題。
代碼實現
semaphore mutex=1; //臨界區互斥信號量
semaphore empty=n; //空閑緩沖區
semaphore full=0; //緩沖區初始化為空
producer() { //生產者進程
while (1) {
produce an item in nextp; //生產數據
P (empty); (要用什么, p 一下) //進入臨界區
P (mutex); (互斥夾緊) //將數據放入緩沖區
add nextp to buffer; (行為) V (mutex); (互斥夾緊) //離開臨界區,釋放互斥信號量
V (full); (提供什么,v 一下) //滿緩沖區數加1
}
}
consumer(){ //消費者進程
while(1){
P(full); //獲取滿緩沖區單元
P(mutex); //進入臨界區
remove an item from buffer; //從緩沖區中取出數據
V(mutex); //離開臨界區,釋放互斥信號量
V(empty); //空緩沖區數加1
consume the item; //消費數據
}
}