C++同時実戦:面接問題4:生産者消費者試験問題blocking queue


生産者消費者問題
これは非常に古典的なマルチスレッドのテーマで、テーマは以下の通りです:1人の生産者が製品を生産して、これらの製品はいくつかの消費者に消費を提供して、生産者と消費者が同時に実行することができるように、両者の間に1つの複数のバッファがあるバッファプールを設置して、生産者はそれを生産した製品を1つのバッファに入れます.消費者はバッファから製品を取り出して消費することができ、すべての生産者と消費者は非同期で動作するが、消費者が空のバッファから製品を取り出すことを許さず、生産者が製品をいっぱい詰めてまだ取り出されていないバッファに製品を投入することを許さないという同期を保たなければならない.
ここでバッファは反発量で実現されるブロックキューを採用し,バッファはboost::circular_を採用する.buffer
#include<iostream>
#include<thread>
#include<mutex>
#include<condition_variable>
#include<array>
#include<boost/circular_buffer.hpp>
using namespace std;
mutex m;
condition_variable full,empty;
boost::circular_buffer<int> Q(10);//       10,      int,    blocking queue
bool flag=true;//       ,        flag       
void put(int x){
    for(int i=0;i<x;i++){
        unique_lock<mutex> lk(m);
        while(Q.full())
            empty.wait(lk);
        assert(!Q.full());
        Q.push_back(i);
        cout<<"@ "<<i<<endl;//  
        full.notify_all();
    }
    flag=false;
}
void take(){
    while(flag){
        unique_lock<mutex> lk(m);
        while(Q.empty())
            full.wait(lk);
        if(flag){
            assert(!Q.empty());
            cout<<"# "<<Q.front()<<endl;//  
            Q.pop_front();
            empty.notify_all();
        }
    }
}
int main(){
    thread one(take);
    thread two(take);
    thread three(take);
    put(100);
    one.join();
    two.join();
    three.join();
    return 0;
}