向標準緩衝區輸出字串時,由於是多執行緒的,所以需要使用讀寫鎖來同步
使用了乙個deque的佇列作為倉庫緩衝區,尾部存放頭部取出
當單單模式變成多多模式時,只是針對單變多的某一方多新增乙個讀寫鎖
需要用到c++11中的 互斥鎖、條件變數確保多執行緒間的資料同步
#include
#include
#include
#include
#include
using
namespace
std;
static
const
int kitemstoproduce = 20;//定義生產者能夠生產的最大產品個數
std::mutex stdoutmutex;//多執行緒標準輸出 同步鎖
struct itemrepository
gitemrepository; // 產品庫全域性變數,生產者和消費者操作該變數.
typedef
struct itemrepository itemrepository;
// 生產 產品
void produceitem(itemrepository &itemrepo, int item)
itemrepo.repository_notfull.wait(lock); // 等待訊號量釋放鎖 生產者等待"倉庫緩衝區不為滿"這一條件發生(將會跳出迴圈).
}itemrepo.itemqueue.push_back(item); // 倉庫放入產品
itemrepo.repository_notempty.notify_all(); // 通知消費者倉庫不為空
lock.unlock(); // 釋放鎖
}// 消費 產品
int consumeitem(itemrepository &itemrepo)
itemrepo.repository_notempty.wait(lock);// 消費者等待"倉庫緩衝區不為空"這一條件發生.(等待訊號跳出迴圈)
}data = itemrepo.itemqueue.front();
itemrepo.itemqueue.pop_front();
itemrepo.repository_notfull.notify_all();
lock.unlock();
return data;
}// 生產者任務
void producertask()
}}// 消費者任務
void consumertask()
if (++cnt == kitemstoproduce) break; // 當消費產品數量 == 生產的數量 退出
}}int main()
produce the 1 ^th item...
produce the 2 ^th item...
produce the 3 ^th item...
produce the 4 ^th item...
produce the 5 ^th item...
produce the 6 ^th item...
produce the 7 ^th item...
produce the 8 ^th item...
produce the 9 ^th item...
produce the 10 ^th item...
倉庫滿了,生產者等待中...
consume the 1^th item...
produce the 11 ^th item...
倉庫滿了,生產者等待中...
consume the 2^th item...
produce the 12 ^th item...
倉庫滿了,生產者等待中...
consume the 3^th item...
produce the 13 ^th item...
倉庫滿了,生產者等待中...
consume the 4^th item...
produce the 14 ^th item...
倉庫滿了,生產者等待中...
consume the 5^th item...
produce the 15 ^th item...
倉庫滿了,生產者等待中...
consume the 6^th item...
produce the 16 ^th item...
倉庫滿了,生產者等待中...
consume the 7^th item...
produce the 17 ^th item...
倉庫滿了,生產者等待中...
consume the 8^th item...
produce the 18 ^th item...
倉庫滿了,生產者等待中...
consume the 9^th item...
produce the 19 ^th item...
倉庫滿了,生產者等待中...
consume the 10^th item...
produce the 20 ^th item...
consume the 11^th item...
consume the 12^th item...
consume the 13^th item...
consume the 14^th item...
consume the 15^th item...
consume the 16^th item...
consume the 17^th item...
consume the 18^th item...
consume the 19^th item...
consume the 20^th item...
可以用 lambda 進行替換
// 等待訊號不為空的通知,wait 第二引數為true時 向下執行,否則一直等待
itemrepo.repository_notempty.wait(lock, [&itemrepo] );
itemrepo.repository_notfull.wait(lock, [&itemrepo] );
單生產者,單消費者
單個生產者和單個消費者 include include include include include include define buffer size 5 產品庫存大小 define product cnt 50 產品生產總數 struct product cons buffer void i...
單生產者 單消費者
父親生產蘋果,女兒消費蘋果,當盤子中沒有蘋果的時候父親生產,女兒只能等待,當盤子中有蘋果的還是父親等待女兒消費 package com.cc.day16 public class demo01 定義乙個類,描述消費的產品 定義公共的變數 public string name public int c...
執行緒 單生產者單消費者
單生產者單消費者 乙個生產線成乙個消費執行緒 乙個生產任務乙個消費任務 乙個產品 public class demo5 產品類class p catch interruptedexception e this.name name this.price price system.out.println...