// 工作线程 void work() { boost::asio::io_service ios; boost::asio::deadline_timer c( ios, boost::posix_time::seconds(1) ); c.async_wait( boost::bind( &listener::check_interrupt, boost::ref(c) ) ); boost::asio::ip::tcp::socket* p=new boost::asio::ip::tcp::socket(ios); _acceptor.async_accept( *p, boost::bind(&listener::handle_accept, this, p, boost::asio::placeholders::error) ); io_service_work(ios); }
void AsioServiceRunner::ServiceThreadProc() { LOG4CPLUS_TRACE_METHOD(Loggers::Service(), "AsioServiceRunner::ServiceThreadProc()"); LOG4CPLUS_INFO(Loggers::Service(), "Thread "<<service_name_<<" started."); assert(io_service_); while(true) { try { boost::asio::io_service::work io_service_work(*io_service_); io_service_->run(); break; } catch(...) { LOG4CPLUS_ERROR(Loggers::Service(), "An error occurred in "<<service_name_<<" thread. Will retry shortly."); io_service_->reset(); } } }
/// <summary>开始监听端口</summary> /// <remarks> /// 本函数会创建 thread_count+1 个线程,一个线程用来监听和接受连接,其他线程处理 /// 网络 IO 操作,所有线程的 io_service 都独立,因此可以保证 IO 的回调都是非并行的。 /// </remarks> void run( const uint16_t port, int thread_count=1, bool hold=false ) { boost::asio::ip::tcp::endpoint _endpoint=asio::ip::tcp::endpoint( asio::ip::tcp::v4(), port ); _acceptor.open( _endpoint.protocol() ); _acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true)); // 允许绑定到同一个端口 _acceptor.bind( _endpoint ); _acceptor.listen( 32 ); // Maybe throw if( thread_count>0 ){ for( int i=0; i<thread_count; ++i ) _threads.create_thread(boost::bind(&listener::work, this )); }else{ boost::asio::ip::tcp::socket *p=new boost::asio::ip::tcp::socket(_io_service_acceptor); _acceptor.async_accept( *p, boost::bind(&listener::handle_accept, this, p, boost::asio::placeholders::error) ); } if( hold ) io_service_work( _io_service_acceptor ); else _threads.create_thread( boost::bind(&listener::io_service_work, this, boost::ref(_io_service_acceptor) ) ); }