c 11 1 單生產者單消費者模式

2021-08-15 07:11:29 字數 3170 閱讀 5065

向標準緩衝區輸出字串時,由於是多執行緒的,所以需要使用讀寫鎖來同步

使用了乙個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...