#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 喚...