綜合運用 c++11 中的新的基礎設施(主要是多執行緒、鎖、條件變數)來闡述乙個經典問題——生產者消費者模型,並給出完整的解決方案。
#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)
int main()
c 11 生產者和消費者
include include include include using namespace std 定義兩個條件變數 佇列未滿 std condition variable queuenotfull 佇列不空 std condition variable queuenotempty 佇列鎖 st...
5 12 生產者和消費者
一 生產者和消費者之間的關係 1 生產者將生產出來的資訊不斷存入乙個區域內,消費者將資訊從該區域內不斷讀取出來 生產者錄入資訊 消費者讀取資訊 例 電影票 public class movie public void setname string name public string getinfo...
6 1 生產者 消費者問題
在多執行緒程式中,執行緒之間通常存在分工。在一種常見模式中,一些執行緒是生產者,一些是消費者。需要強制執行幾個同步約束才能使此系統正常工作 在緩衝區中新增或刪除專案時,緩衝區處於不一致狀態。因此,執行緒必須具有對緩衝區的獨佔訪問許可權。如果消費者執行緒在緩衝區為空時到達,則會阻塞,直到生產者新增新專...