生產者 消費者問題演算法的實現 實驗報告

2022-10-11 18:15:07 字數 1918 閱讀 3008

一、實驗內容

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 每個消費者程序...

生產者消費者問題

public class producer consumer class godown public godown int num public synchronized void produce int n catch interruptedexception e curr num n syste...

生產者 消費者問題

在學習程序互斥中,有個著名的問題 生產者 消費者問題。這個問題是乙個標準的 著名的同時性程式設計問題的集合 乙個有限緩衝區和兩類執行緒,它們是生產者和消費者,生產者把產品放入緩衝區,相反消費者便是從緩衝區中拿走產品。生產者在緩衝區滿時必須等待,直到緩衝區有空間才繼續生產。消費者在緩衝區空時必 須等待...