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 }
创建一个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 }
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 }
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 }
stop成员函数。stop成员函数将发信号给io_service,提示所有任务将停止。
线程池模型1
多个线程共享一个任务队列,用户把任务投递到该任务队列中,其他线程竞争从该队列中获取任务执行。
结合boost::thread,在多个线程里面调用run方法.
线程池的瓶颈在于一个任务队列,多个线程竞争取任务,在大并发的程序里面容易导致性能下降。