c++11生産者消費者モデルの実現

1843 ワード


1.生産者と消費者モデル
一つの場所、二つの役、三つの関係.(場所:スレッドが安全なキュー)
2.メリット
デカップリング、サポートビジームラ、サポート同時
3.実現
反発ロック、条件変数の使用
#include   
#include   
#include   
#include   
#include   



class Producer_Consumer  
{  
private:  
    deque _q; //  
    mutex _mtx; //  .  
    condition_variable _cv; //  .  
    int       _count;  // 
  
private:  
    void Product{  
        while (true){  

            unique_lock  lck(_mtx);  
            _count = ++_count % 1000;  
            printf("product %d
", _count); _q.push_back(_count); lck.unlock(); _cv.notify_all(); } } void Consume{ while (true){ unique_lock lck(_mtx); while (_q.empty()){ _cv.wait(lck); } int nData = _q.front(); _q.pop_front(); printf("consume %d
", nData); lck.unlock(); } } public: CThreadDemo(){ _q.clear(); _count = 0; } void Test(){ vector threads; threads.clear(); for (int i = 0; i < 5; i++){/* */ threads.push_back(thread(&Producer_Consumer::Product, this)); } for (int i = 5; i < 10; i++){/* */ threads.push_back(thread(&Producer_Consumer::Consume, this)); } for (auto& t : threads){/* */ t.join(); } } }; int main(int argc, _TCHAR* argv[) { Producer_Consumer p; p.Test(); return 0; }