2012-01-29 49 views
1

我使用boost ASIO來處理這樣每個線程的會話:升壓ASIO - 會話線程並沒有結束

Server::Server(ba::io_service& ioService, int port): ioService_(ioService), port_(port) 
{ 
    ba::ip::tcp::acceptor acceptor(ioService_, ba::ip::tcp::endpoint(ba::ip::tcp::v4(), port_)); 
    for (;;) 
    { 
     socket_ptr sock(new ba::ip::tcp::socket(ioService_)); 
     acceptor.accept(*sock); 
     boost::thread thread(boost::bind(&Server::Session, this, sock)); 
    } 
} 

void Server::Session(socket_ptr sock) 
{ 
    const int max_length = 1024; 
    try 
    { 
     char buffer[256] = ""; 
     // HandleRequest() function performs async operations 
     if (HandleHandshake(sock, buffer)) 
      HandleRequest(sock, buffer); 

     ioService_.run(); 
    } 
    catch (std::exception& e) 
    { 
     std::cerr << "Exception in thread: " << e.what() << "\n"; 
    } 

    std::cout << "Session thread ended \r\n"; // THIS LINE IS NEVER REACHED 
} 

在服務器::會議()我在某些時候異步IO使用async_read_some(辦)和async_write()函數。 一切運作良好,爲了這個工作我必須有我的產卵線程否則服務器::會議()函數退出內部ioService_.run()的調用,它不處理所需的IO工作。

的問題是,ioService_.run()從我的線程調用會導致該線程完全不退出,因爲在此期間,其他請求來我的聽力服務器套接字。

什麼我最終是啓動線程和處理,現在的會議,但從來沒有釋放資源(結束)。使用這種方法時是否可以只使用一個boost :: asio :: io_service?

+1

這是一種使用boost :: asio的奇怪方法。你讀過教程嗎?看看HTTP Server 3的例子。它使用線程池來服務多個連接,每個線程調用'io_service :: run()'。 – mark 2012-01-29 19:38:08

+0

@mark我實際上是在尋找一個簡單的解決方案,只是我的程序的一個概念證明。我設法做到了,最終沒有使用線程 – Ghita 2012-01-30 09:05:41

回答

1

我相信你正在尋找run_one()poll_one()這將允許你讓線程執行一個就緒處理程序(輪詢)或等待一個處理程序(運行)。通過只處理一個,你可以選擇退出你的線程之前執行多少。相對於run()它,直到io_service停止執行所有的處理程序。在poll()處理完當前所有準備就緒後將停止。

+0

感謝您指出。我不得不使用你所提到的功能的一些試驗,但在我的情況下,它是一種很難知道我需要多長時間才能調用run_one(),因爲在此期間其他連接請求都來我的服務器(分派其他線程),他們全部由相同的io_service處理。我的概念驗證程序的簡化內容不使用線程。 – Ghita 2012-01-30 09:10:55