• boost::asio


    asio是boost提供的一个c++异步编程模型库,其核心类io_service,在多线程编程里面提供了任务队列和任务分发功能,在socket、io编程里主要作为一个事件驱动器(完成端口、select、poll、epoll等)。

    调用run成员函数。run函数将阻塞直到所有任务完成 并且没有任何处理器被分发,或者直到io_service被停止。

     1 #include <boost/asio.hpp>
     2 #include <iostream>
     3  
     4 int main( int argc, char * argv[] )
     5 {
     6     boost::asio::io_service io_service;
     7     io_service.run();
     8     std::cout << "io_service is done !" << std::endl;
     9     return 0;
    10 }
    View Code

    创建一个work类。work类在有任务运行时通知io_service。当io_service有一个任务对象与其关联,它将不会停止运行。

     1 #include <boost/asio.hpp>
     2 #include <iostream>
     3 int main( int argc, char * argv[] )
     4 {
     5     boost::asio::io_service io_service;
     6     boost::asio::io_service::work work( io_service );
     7     io_service.run();
     8     std::cout << "io_service not end" << std::endl;
     9     return 0;
    10 }
    View Code

    poll函数在没有任务运行时候不 会阻塞。poll函数简单执行当前任务组并且返回。

     1 #include <boost/asio.hpp>
     2 #include <iostream>
     3  
     4 int main( int argc, char * argv[] )
     5 {
     6     boost::asio::io_service io_service;
     7     for( int x = 0; x < 10; ++x )
     8     {
     9         io_service.poll();
    10     }
    11     return 0;
    12 }
    View Code

    io_service移除一个work对象。通过查看文档,没有函数提供此种功能。为了实现此种功能,我们必须使用work对象的智能指针。

     1 #include <boost/asio.hpp>
     2 #include <boost/shared_ptr.hpp>
     3 #include <iostream>
     4  
     5 int main( int argc, char * argv[] )
     6 {
     7     boost::asio::io_service io_service;
     8     boost::shared_ptr< boost::asio::io_service::work > work(
     9                 new boost::asio::io_service::work( io_service )
    10         );
    11     work.reset();//移除
    12  
    13     io_service.run();
    14     return 0;      
    15 }
    View Code

    stop成员函数。stop成员函数将发信号给io_service,提示所有任务将停止。

    线程池模型1

    多个线程共享一个任务队列,用户把任务投递到该任务队列中,其他线程竞争从该队列中获取任务执行。

    结合boost::thread,在多个线程里面调用run方法.

    线程池的瓶颈在于一个任务队列,多个线程竞争取任务,在大并发的程序里面容易导致性能下降。

  • 相关阅读:
    iView -- TimePicker 自定义修改时间选择器选择时间面板样式
    Go语言--容器:存储和组织数据的方式--数组、切片
    php递归实现一维数组转为指定树状结构 --- 省市区处理
    Go语言--基础语法笔记
    Mongodb 安装错误汇总
    GIt -- git push 远程分支老是需要重新输入公钥密码问题处理?
    GIt -- fatal: refusing to merge unrelated histories 问题处理
    Linux -- Centos6 yum安装相关问题与处理
    Linux -- Xshell ,Xftp远程连接中文乱码怎么解决?
    Laravel 多数据库配置及查询操作
  • 原文地址:https://www.cnblogs.com/osbreak/p/9253567.html
Copyright © 2020-2023  润新知