2014-01-10 48 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密集型的處理,那麼處理程序應該被傳遞給某種類型的任務管理器。

相關問題