一、實驗內容
1.問題描述:一組生產者向一組消費者提供訊息,它們共享乙個有界緩衝池,生產者向其中投放訊息,消費者從中取得訊息。假定這些生產者和消費者互相等效,只要緩衝池未滿,生產者可將訊息送入緩衝池,只要緩衝池未空,消費者可從緩衝池取走乙個訊息。
2.功能要求:根據程序同步機制,編寫乙個解決上述問題的程式,可顯示緩衝池狀態、放資料、取資料等過程。
二、背景知識
1.程序管理。
2.訊號量的有關知識。
三、思路
生產者的主要作用是生成一定量的資料放到緩衝區中,然後重複此過程。與此同時,消費者也在緩衝區消耗這些資料。該問題的關鍵就是要保證生產者不會在緩衝區滿時加入資料,消費者也不會在緩衝區中空時消耗資料。為使生產者程序與消費者程序能併發執行,在兩者之間設定了乙個具有 n 個緩衝區的緩衝池:生產者程序從檔案中讀取乙個資料,並將它存放到乙個緩衝區中;消費者程序從乙個緩衝區中取走資料,並輸出此資料。生產者和消費者之間必須保持同步原則:不允許消費者程序到乙個空緩衝區去取產品;也不允許生產者程序向乙個已裝滿產品且尚未被取走的緩衝區中投放產品。實現乙個生產者對多個消費者,每一次生成數隨機,若為奇數為生產者生產,反之為消費者消費,因此該過程是1對n的生產者消費者問題。
四、核心**
#include //乙個生產者,多個消費者,會在每次消費之前判斷當前緩衝池有無商品
#include //生成數隨機,消費者、生產者生產和消費隨機
#include
#define n 10 //產品引數
using namespace std;
/*定義生產者消費者類*/
class ppcc
/*生產者生產*/
void producer()
wait(empty);//empty--;
buffer[out] = 1; //生產乙個產品
out = (out + 1) % n; //尾指標後移一位,構成迴圈佇列
cout << "生產者生產了乙個產品" << endl;
/*對count互斥訪問*/
wait(mutex);
count++;
signal(mutex);
}/*消費者消費*/
void consumer()
buffer[in] = 0;//消費乙個產品
in = (in + 1) % n;//頭指標後移一位,構成迴圈佇列
cout << "消費者消費了乙個產品" << endl;
/*對count互斥訪問*/
wait(mutex);
count--;
signal(mutex);
if (empty <= n)
}/*顯示現在緩衝區的情況*/
void display()
void wait(int &s)
void signal(int &s)
/*函式主體*/
int main() while (i != 30);//(可修改次數)
return 0;
}五、執行結果
六、結論
緩衝區是臨界資源,各程序必須互斥地訪問,為了避免兩個程序之間相互干擾,我們利用訊號量機制來實現程序間互斥和同步 ,使用陣列模擬的迴圈佇列來完成緩衝區。生產者程序向緩衝區投入產品,則count加1;消費者程序向緩衝區取出產品,則count減1。
搜尋複製
生產者 消費者問題實現
include include include include include include define need p 2 生產者程序數 define need c 2 消費者程序數 define works p 10 每個生產者程序執行的次數 define works c 10 每個消費者程序...
C 實現「生產者消費者」問題
有時候我們做專案時不免遇到這樣乙個問題 我們需要做乙個功能,該功能需要處理來自於其他地方的資料,但是你需要保證任務需要乙個乙個循序漸進的進行,與此同時,資料 的時機不可預知,有時任務一下子來了100條,有時一下子只來了1條,你要怎樣處理這些資料,使得這些任務被執行的時候是一條一條的執行的。描述真含糊...
生產者消費者問題(C實現)
生產者消費者問題是作業系統中的乙個經典的問題。然後看了作業系統的書籍如何解決書上給的偽 是這樣的 item b k semaphore empty empty k 可以使用的空緩衝區數 semaphore full full 0 緩衝區內可以使用的產品數 semaphore mutex mutex ...
生產者消費者問題(java實現)
1 生產者 消費者模型 若容器容量為1 生產者執行緒 if a 1 a notify 消費者 if a 0 a notify 2 下面是乙個 實現 簡單的快取容量只有1,即 若容器中有乙個了,就不能再生產了 1 最基本的寫法 資源類 public class sample catch interru...
Java實現生產者消費者問題
生產者 消費者 producer consumer 問題,也稱作有界緩衝區 bounded buffer 問題,兩個程序共享乙個公共的固定大小的緩衝區。其中乙個是生產者,用於將訊息放入緩衝區 另外乙個是消費者,用於從緩衝區中取出訊息。問題出現在當緩衝區已經滿了,而此時生產者還想向其中放入乙個新的資料...