博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于boost 线程并行技术实现消息队列方式[记录]
阅读量:4977 次
发布时间:2019-06-12

本文共 2017 字,大约阅读时间需要 6 分钟。

#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;
}

转载于:https://www.cnblogs.com/toosuo/archive/2012/04/20/2459764.html

你可能感兴趣的文章
nginx启动、关闭命令、重启nginx报错open() "/var/run/nginx/nginx.pid" failed
查看>>
BZOJ 3097 Hash Killer I
查看>>
UINavigationController的视图层理关系
查看>>
html阴影效果怎么做,css 内阴影怎么做
查看>>
BZOJ1026: [SCOI2009]windy数
查看>>
组件:slot插槽
查看>>
Nginx配置文件nginx.conf中文详解(转)
查看>>
POJ 1308 Is It A Tree?(并查集)
查看>>
N进制到M进制的转换问题
查看>>
springIOC第一个课堂案例的实现
查看>>
求输入成绩的平均分
查看>>
php PDO (转载)
查看>>
wordpress自动截取文章摘要代码
查看>>
[置顶] 一名优秀的程序设计师是如何管理知识的?
查看>>
highcharts 图表实例
查看>>
highcharts曲线图
查看>>
extjs动态改变样式
查看>>
宏定义
查看>>
笔记:git基本操作
查看>>
生成php所需要的APNS Service pem证书的步骤
查看>>