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方法.

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

 

posted @ 2018-07-02 14:13  osbreak  阅读(334)  评论(0编辑  收藏  举报