生產者消費者模型

2022-08-12 09:18:11 字數 3008 閱讀 5447

#include #include 

#include

using

namespace

std;

static

const

int buffersize = 10

;static

const

int product_num = 50

;handle mutex;

handle fullsemaphore;

handle emptysemaphore;

int real_product_num = 0

;int curval = 0

;void

produce()

dword winapi producer(lpvoid lppara)

}void

consume()

dword winapi consumer(lpvoid lppara)

}int

main()

for(int i = 0;i < 5;i++)

while(real_product_num return0;

}

#include#include

#include

#include

#include

using

namespace

std;

const unsigned short size = 10; //

緩衝區長度

unsigned short curvalue = 0; //

當前產品數

bool g_continue = true; //

控制程式結束:true(執行);false(結束)

handle g_hmutex;

//用於執行緒間的互斥

handle g_hfullsemaphore; //

當緩衝區滿時迫使生產者等待

handle g_hemptysemaphore; //

當緩衝區空時迫使消費者等待

dword winapi producer(lpvoid); //

生產者執行緒

dword winapi consumer(lpvoid); //

消費者執行緒

intmain()

//建立消費者執行緒

srand( (unsigned)time( null ) );

int t2 = rand()%(size+1

);

for (int i = 0; i < t2; i++)

while

(g_continue)

return0;

}void

produce()

void

consume()

//生產者

dword winapi producer(lpvoid lppara)

return0;

}//消費者dword winapi consumer(lpvoid lppara)

return0;

}

#include #include 

#include

#include

#include

#include

static

const

int kitemrepositorysize = 10; //

item buffer size.

static

const

int kitemstoproduce = 1000; //

how many items we plan to produce.

struct

itemrepository gitemrepository; //

產品庫全域性變數, 生產者和消費者操作該變數.

typedef

struct

itemrepository itemrepository;

void produceitem(itemrepository *ir, int

item)

(ir->item_buffer)[ir->write_position] = item; //

寫入產品.

(ir->write_position)++; //

寫入位置後移.

if (ir->write_position == kitemrepositorysize) //

寫入位置若是在佇列最後則重新設定為初始位置.

ir->write_position = 0

; (ir->repo_not_empty).notify_all(); //

通知消費者產品庫不為空.

lock.unlock(); //

解鎖.}

int consumeitem(itemrepository *ir)

data = (ir->item_buffer)[ir->read_position]; //

讀取某一產品

(ir->read_position)++; //

讀取位置後移

if (ir->read_position >= kitemrepositorysize) //

讀取位置若移到最後,則重新置位.

ir->read_position = 0

; (ir->repo_not_full).notify_all(); //

通知消費者產品庫不為滿.

lock.unlock(); //

解鎖.return data; //

返回產品.

}void producertask() //

生產者任務

}void consumertask() //

消費者任務

}void inititemrepository(itemrepository *ir)

intmain()

生產者消費者模型

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

生產者消費者模型

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

生產者消費者模型

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