2014-01-10 45 views
0

Daytime.3教程的boost :: ASIO(异步TCP服务器),类tcp_server包含以下两种方法:在boost :: asio中,为什么异步接受处理程序需要重新启动异步接受?

void start_accept() 
{ 
    tcp_connection::pointer new_connection = 
    tcp_connection::create(acceptor_.get_io_service()); 

    acceptor_.async_accept(new_connection->socket(), 
     boost::bind(&tcp_server::handle_accept, this, new_connection, 
     boost::asio::placeholders::error)); 
} 

void handle_accept(tcp_connection::pointer new_connection, 
    const boost::system::error_code& error) 
{ 
    if (!error) new_connection->start(); // *** 

    start_accept(); 
} 

我关心的是行标***。如果此操作需要很长时间才能完成,该怎么办?即使没有,在***行与start_accept的呼叫之间必定有一段时间间隔,在此期间服务器将无法接受传入连接。 async_accept注册一个操作系统处理程序在接受其第一个连接时不会停止是否更有意义?另外,这是一个真正的问题,我将如何解决它?

回答

2

服务器不会“无法接受传入的连接”;这就是套接字API中listen()函数的第二个参数。但是你确定服务器在处理客户端请求时可能会有延迟。需要大量计算的单线程应用程序会导致问题,因此为什么这个特定的示例只能执行IO。如果你的服务器真的需要执行一些CPU密集型的处理,那么处理程序应该被传递给某种类型的任务管理器。

相关问题