2011-07-11 81 views
1

我編制了boost :: ASIO例如: http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/examples.html#boost_asio.examples.http_server_3的boost :: ASIO併發

它應該是一個多線程服務器實現。

現在,在async_read處理程序中,我打印一條消息並休眠30秒。我在兩個瀏覽器中打開localhost,看到handle_read被調用一次,然後30秒沒有任何反應,最後第二次調用handle_read。

用5個線程調用io_Service.run。

爲什麼處理程序不同時調用?例如爲什麼在調用第二個handle_read之前等待第一個handle_read?

+3

向我們顯示您的代碼。我敢打賭,你不會註冊一個新的聽衆,直到睡眠之後。 –

+0

您是否在睡眠之前從句柄中啓動了新的async_read()? – Olympian

+0

是的,我在新的async_read之前放置睡眠。 http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/example/http/server3/connection.cpp 基本上立即在if(!e)之後。 我認爲它的工作原理是,它可以按連接工作。所以我想處理客戶端1的數據,並且只在處理完成後才接收新數據。 但是,它正在處理客戶端1我也想處理客戶端2。 – thelamb

回答

1

它有助於發佈代碼。當我用這個修改的ASIO例如:

void connection::handle_read(const boost::system::error_code& e, 
    std::size_t bytes_transferred) 
{ 
    std::cerr << "connection::handle_read()\n"; 
    boost::this_thread::sleep(boost::posix_time::seconds(10)); 
    std::cerr << "connection::handle_read() done sleep\n"; 
    if (!e) 
    { 

它能正常工作,這是

$ ./test 0.0.0.0 7777 5 . 
connection::handle_read() 
connection::handle_read() 
connection::handle_read() done sleep 
connection::handle_read() done sleep 

你是如何「睡眠30秒」?也許您使用的睡眠函數會暫停進程中的所有線程?