生产者消费者问题
这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,所有生产者和消费者都是异步方式运行的,但它们必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经装满产品且尚未被取走的缓冲区中投放产品。
这里缓冲区采用互斥量实现的阻塞队列,缓冲区采用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; }