基于boost 线程并行技术实现消息队列方式



小立再也没有机会,就这样失去,人生当中最大的悲哀莫过于此。才发现原来生活就是这么的槽糕,所有的都是没有劲的。

    翻遍csdn,也翻遍博客园,更翻遍google 中文,翻遍英文只有两篇。就以此文献给这些堕落的,颓废的,乱七八槽的日子吧。



#include <queue>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <boost/thread/tss.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>


#include <iostream>
using namespace std;
using namespace boost;


boost::recursive_mutex io_mutex;
boost::condition_variable_any cond;
std::queue<int>  iq;

class printer
{
public:
    printer(boost::asio::io_service& io,int n)
        : strand_(io),
        timer1_(io, boost::posix_time::seconds(1)),
        timer2_(io, boost::posix_time::seconds(1)),
        count_(n)
    {
        timer2_.async_wait(boost::bind(&printer::enqueue, this));
        timer1_.async_wait(boost::bind(&printer::dequeue, this));
       
    }

    ~printer()
    {
         boost::recursive_mutex::scoped_lock  lock(io_mutex);
        std::cout << "Final count is " << count_ << "\n";
    }

    void dequeue()
    {
        boost::recursive_mutex::scoped_lock  lock(io_mutex);
        while(iq.empty())
        {
          cond.wait(lock);       
       
        }
        int pop =0;
        if (!iq.empty())
        {           
            pop = iq.front();
            iq.pop();
            cout<<"------------pop "<<pop<<endl;
        }
        cond.notify_all();
      
        timer1_.expires_at(timer1_.expires_at() + boost::posix_time::seconds(1));
        timer1_.async_wait(boost::bind(&printer::dequeue, this));       
    }

    void enqueue()
    {
        boost::recursive_mutex::scoped_lock  lock(io_mutex);        

        while(iq.size() == 1000)
        {
          cond.wait(lock);           
        }

        iq.push(count_);;
        cond.notify_all();
        cout<<"------------push "<<count_<<endl;
        timer1_.expires_at(timer1_.expires_at() + boost::posix_time::seconds(1));
        timer1_.async_wait(boost::bind(&printer::enqueue, this));          
    }

private:
    boost::asio::strand strand_;
    boost::asio::deadline_timer timer1_;
    boost::asio::deadline_timer timer2_;
    int count_;
};


int main()
{
    thread_group threads;
    boost::asio::io_service io;
    

    printer * p[1000];
    int num = 1000;
    for(int i = 0; i < num; i++)
    {
        p[i] = new printer(io,i);

        threads.create_thread(boost::bind(&boost::asio::io_service::run, &io));
    }

   
    io.run();   
    threads.join_all();
   

    std::system("pause");
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值