簡體   English   中英

在boost :: asio中,為什么異步接受處理程序需要重啟異步接受?

[英]In boost::asio, why does the asynchronous accept handler need to restart the asynchronous accept?

在boost :: asio(異步TCP服務器)的Daytime.3教程中,類tcp_server包含以下兩種方法:

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注冊一個在接受第一次連接時不會停止的OS處理程序會不會更有意義? 此外,這是一個真正的問題,我將如何解決它?

服務器不會“無法接受傳入連接”; 這就是套接字API中listen()函數的第二個參數。 但是你是正確的,服務器可以延遲處理客戶端請求。 需要大量計算的單線程應用程序將導致問題,因此這個特定示例實際上只執行IO的原因。 如果您的服務器確實需要執行CPU密集型操作,那么應該將處理程序傳遞給某種類型的任務管理器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM