生產者消費者模型

2021-10-08 15:42:36 字數 1763 閱讀 1280

生產者消費者問題(英語:producer-consumer problem),也稱有限緩衝問題(英語:bounded-buffer problem),是乙個多程序同步問題的經典案例。該問題描述了共享固定大小緩衝區的兩個程序——即所謂的「生產者」和「消費者」——在實際執行時會發生的問題。生產者的主要作用是生成一定量的資料放到緩衝區中,然後重複此過程。與此同時,消費者也在緩衝區消耗這些資料。該問題的關鍵就是要保證生產者不會在緩衝區滿時加入資料,消費者也不會在緩衝區中空時消耗資料。

要解決該問題,就必須讓生產者在緩衝區滿時休眠(要麼乾脆就放棄資料),等到下次消費者消耗緩衝區中的資料的時候,生產者才能被喚醒,開始往緩衝區新增資料。同樣,也可以讓消費者在緩衝區空時進入休眠,等到生產者往緩衝區新增資料之後,再喚醒消費者。

在多執行緒程式中可能存在資源競爭問題。一般是通過訊號量和互斥鎖來保證執行緒安全。

執行緒安全的生產者和消費者模式。

具體過程簡單的說來就是:當緩衝區空時消費者阻塞,生產者忙;當緩衝區滿時,生產者阻塞,消費者忙。

#include 

#include

#include

#include

#include

#include

#include

using namespace std;

template

class block_buffer);

_content.push_back(item)

; _con_var.notify_all();

cout<<

"push item into buffer "

<< item<

} t dequeue())

; t item = _content.front();

_content.pop_front();

_con_var.notify_all();

cout<<

"delete item from buffer "

<

return item;}}

;template

class producer

void produce()}

int produce_function()}

;template

class consumer

void consume()}

void consume_function(int &item)};

int main(

)

執行結果。

push item into buffer 18467

delete item from buffer 18467

push item into buffer 26500

delete item from buffer 26500

push item into buffer 15724

push item into buffer 29358

delete item from buffer 15724

push item into buffer 24464

delete item from buffer 29358

push item into buffer 28145

delete item from buffer 24464

生產者消費者模型

1.生產者消費者問題 producer consumer 有限緩衝,多執行緒同步。生產者執行緒和消費者執行緒共享固定大小緩衝區。2.關鍵是保證生產者不會再緩衝區滿時加入資料,消費者不會在緩衝區空時消耗資料。3.解決辦法 讓生產者在緩衝區滿時休眠,等下次消費者消耗緩衝區中的資料的時候,生產者才能被喚醒...

生產者消費者模型

生產者與消費者 3,2,1 三種關係 生產者與消費者 互斥,同步 消費者與消費者 互斥 生產者與生產者 互斥 條件變數 int pthread cond destroy pthread cond t cond int pthread cond init pthread cond t restrict...

生產者消費者模型

當佇列滿時,生產者需要等待佇列有空間才能繼續往裡面放入商品,而在等待的期間內,生產者必須釋放對臨界資源 即佇列 的占用權。因為生產者如果不釋放對臨界資源的占用權,那麼消費者就無法消費佇列中的商品,就不會讓佇列有空間,那麼生產者就會一直無限等待下去。因此,一般情況下,當佇列滿時,會讓生產者交出對臨界資...