單生產者 多消費者模型

2021-09-21 18:07:43 字數 1854 閱讀 6733

問題出處: 

生產者消費者問題:有乙個生產者在生產產品,這些產品將提供給若干個消費者去消費,為了使生產者和消費者能併發執行,在兩者之間設定乙個有多個緩衝區的緩衝池,生產者將它生產的產品放入乙個緩衝區中,消費者可以從緩衝區中取走產品進行消費,所有生產者和消費者都是非同步方式執行的,但它們必須保持同步,即不允許消費者到乙個空的緩衝區中取產品,也不允許生產者向乙個已經裝滿產品且尚未被取走的緩衝區中投放產品。

分析:假設1個生產者,2個消費者,緩衝區大小為4。

第一.從緩衝區取出產品和向緩衝區投放產品必須是互斥進行的。可以用關鍵段和互斥量來完成。

第二.生產者要等待緩衝區為空,這樣才可以投放產品,消費者要等待緩衝區不為空,這樣才可以取出產品進行消費。並且由於有二個等待過程,所以要用二個事件或訊號量來控制。

#include #include #include #include #include #include #include char signal = 'a';

std::mutex mutex_t;

std::condition_variable cond_pro;//生產者

std::condition_variable cond_cons;//消費者

std::queueque;

const int size = 4;//緩衝區大小4

int temp = 1;

void producer()

std::this_thread::sleep_for(std::chrono::milliseconds(1000));

printf("produce %d\n", temp);

que.push(temp++);

cond_cons.notify_all(); }}

void consumer(int i)

printf("consumer%d consume %d\n",i,que.front());

que.pop();

cond_pro.notify_one();

std::this_thread::sleep_for(std::chrono::milliseconds(500*i)); }}

int main()

produce 1

produce 2

produce 3

consumer1 consume 1

consumer1 consume 2

consumer1 consume 3

produce 4

consumer2 consume 4

produce 5

consumer2 consume 5

produce 6

produce 7

produce 8

produce 9

consumer2 consume 6

consumer2 consume 7

produce 10

consumer1 consume 8

consumer1 consume 9

produce 11

consumer2 consume 10

consumer1 consume 11

produce 12

consumer1 consume 12

produce 13

consumer1 consume 13

produce 14

consumer1 consume 14

produce 15

consumer1 consume 15

produce 16

consumer2 consume 16

生產者消費者模型二(單 多模型)

生產者 消費者問題 producer consumer 又名 有界緩衝區 bounded buffer 問題 單生產者 多消費者 設計要點 當緩衝區滿已滿,而此時生產者還想向緩衝區中放入乙個新的資料項時。則讓生產者睡眠,待消費者從緩衝區中取出乙個或多個資料項時再喚醒生產者。同樣的,當緩衝區滿已空,而...

生產者消費者問題之多生產者 單消費者模型

與單生產者和單消費者模型不同的是,多生產者 單消費者模型中可以允許多個生產者同時向產品庫中放入產品。所以除了保護產品庫在多個讀寫執行緒下互斥之外,還需要維護生產者放入產品的計數器,如下 include include include include include static const int ...

生產消費模型 多生產者vs多消費者

使用場景 遊戲中多個玩家生產任務,伺服器多執行緒處理任務,netty工作執行緒收到客戶端傳來資料,生成任務後,加入到任務佇列中 public abstract class basetask 任務管理器 public class mutitaskmanager private final static...