生產者 消費者問題

2021-07-03 07:04:57 字數 952 閱讀 2800

有一群生產者程序在生產產品,並將這些產品提供給消費者程序去消費.為使生產者程序與消費者程序能併發執行,在兩者之間設定了乙個具有n個緩衝區的緩衝池,生產者程序將它所生產的產品放入乙個緩衝區中;消費者程序可以從乙個緩衝區中取走產品去消費。

int

in=0,out=0;

void producer() //生產者程式

}void consumer() //消費者程式

}

雖然上述的生產者和消費者程式在分別看時都是正確的,即使是順序執行時結果也是對的,但是,當存在多個生產者,消費者時,就會出現錯誤,主要體現在以下方面:

1. 同步問題

即:不允許消費者程序到乙個空緩衝區去取產品,也不允許生產者程序向乙個滿緩衝區投放產品。在上述程式中,這些情況均未加以控制。因此,可利用訊號量empty和full分別表示緩衝區中空緩衝區和滿緩衝區的資源數量。同時,假定只要緩衝區未滿,生產者便可將產品送入緩衝區;只要緩衝區未空,消費者便可緩衝區中取走乙個產品。

2.互斥問題

由於緩衝區是由生產者和消費者共享的儲存空間,應當互斥訪問,即:生產者修改緩衝區時,禁止消費者從緩衝區中取走資料;反之亦然。為此,可以利用互斥訊號量mutex實現程序對緩衝區的互斥訪問。

至此,對生產者-消費者問題,偽碼可修改如下:

int

in=0,out=0;

semaphore empty,full,mutex;

empty.value=n; //空緩衝區資源訊號量,初始狀態有n個空的緩衝區

full.value=0; //滿緩衝區資源訊號量,初始狀態有0個滿緩衝區

mutex.value=0; //緩衝區互斥訪問量

void producer() //生產者程式

}void consumer() //消費者程式

}

生產者消費者問題

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 ...