2012-06-18 30 views
0

這是我的服務器代碼:升壓async_read_some不完全異步

socket_.async_read_some(boost::asio::buffer(data_read.data(), Message::header_length), 
    boost::bind(&TcpConnection::handle_read_header, shared_from_this(), 
    boost::asio::placeholders::error)); 

如果我在「handle_read_header」功能的循環

boost::thread::sleep(boost::posix_time::seconds(2)); 

它是由被稱爲寫了下面的代碼在'async_read_some'之上,整個線程正在等待直到睡眠結束。所以當另一個請求進來時,它不會被處理,直到睡眠結束。是不是假設異步處理每個請求?我是新的提升和C++。如果我提到有任何問題,請告訴我。

+0

其實,即使「睡覺」Boost :: asio仍然會繼續異步讀取。只是,如果一個處理程序正在運行並且只使用一個線程,則Asio無法通知您有關讀取的完成情況。你會如何預期它的行爲? – ereOn

+0

@ereOn你是說我在'handle_read_header'內調用的方法應該在一個不同的線程中?和ereOn不是async_read_some爲每個處理程序創建新線程? – Navin

+0

@ereOn如果我在線程完成套接字的時候調用處理程序中的線程,則新請求可能已更改。 – Navin

回答

3

閱讀計劃與async_read_some是在線程中實現的,調用io_service::run()。 如果您只有一個線程它將等待完成一個讀取處理程序,然後再啓動另一個

您可以創建一個線程池,通過運行更多的線程與io_service::run()或使讀處理程序的執行更短。

+0

感謝您的快速回復,我嘗試'io_service :: run()',但它似乎並不完全正常工作。但是,我正試圖縮短讀取處理程序的執行時間。 – Navin

+0

@Navin什麼工作不正常?也許你沒有同步訪問共享變量? –