生產者消費者

2022-08-27 14:36:12 字數 2137 閱讀 1553

#include #include 

#include

#include

#include

#include

#include

#define guid_len 64

using

namespace

std;

static

int kitemstoproduce = 1

;static

bool g_go_on_push_flag = true

;static

bool g_go_on_send_flag = true

;std::mutex stdoutmutex;

//多執行緒標準輸出 同步鎖

struct

framerepository

gitemrepository; //

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

typedef

struct

framerepository framerepository;

std::

string

generateuuid()

; guid guid;

if (cocreateguid(&guid))

_snprintf_s(buffer,

sizeof

(buffer),

"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",

guid.data1, guid.data2, guid.data3,

guid.data4[

0], guid.data4[1], guid.data4[2

], guid.data4[

3], guid.data4[4], guid.data4[5

], guid.data4[

6], guid.data4[7

]);

return std::string

(buffer);}//

生產 產品

void pushframeitem(framerepository &itemrepo, std::string

frame_info)

//等待訊號量釋放鎖 生產者等待"倉庫緩衝區不為滿"這一條件發生(將會跳出迴圈).

//}itemrepo.repository_notfull.wait(

lock, [&itemrepo]

return !full;

});itemrepo.frame_queue.push_back(frame_info);

//倉庫放入產品

itemrepo.repository_notempty.notify_all(); //

通知消費者倉庫不為空

lock.unlock(); //

釋放鎖}

//消費 產品

std::string sendframeitem(framerepository &itemrepo)

//消費者等待"倉庫緩衝區不為空"這一條件發生.(等待訊號跳出迴圈)

//}//等待訊號不為空的通知,wait 第二引數為true時 向下執行,否則一直等待

itemrepo.repository_notempty.wait(lock, [&itemrepo]

return !empty;

});frame_info =itemrepo.frame_queue.front();

itemrepo.frame_queue.pop_front();

itemrepo.repository_notfull.notify_all();

lock

.unlock();

return

frame_info;}//

生產者任務

void

pushframetask()

kitemstoproduce++;

}}//

消費者任務

void

sendframetask()

consume_cnt++;

}}int

main()

生產者消費者 生產者與消費者模式

一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...

生產者消費者

using system using system.collections.generic using system.threading namespace gmservice foreach thread thread in producers q.exit console.read public...

生產者消費者

執行緒通訊 乙個執行緒完成了自己的任務時,要通知另外乙個執行緒去完成另外乙個任務.wait 等待 如果執行緒執行了wait方法,那麼該執行緒會進入等待的狀態,等待狀態下的執行緒必須要被其他執行緒呼叫notify方法才能喚醒。notify 喚醒 喚醒執行緒池等待執行緒其中的乙個。notifyall 喚...