首页 > 编程语言 > 详细

C++并发实战:生产者消费者试题

时间:2014-03-27 14:39:38      阅读:469      评论:0      收藏:0      [点我收藏+]

生产者消费者问题

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


这里缓冲区采用互斥量实现的阻塞队列,缓冲区采用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;
}


C++并发实战:生产者消费者试题,布布扣,bubuko.com

C++并发实战:生产者消费者试题

原文:http://blog.csdn.net/liuxuejiang158blog/article/details/22281869

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!