2011-07-11 31 views
1

私はブーストをコンパイルしています:: ASIO例(?): http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/examples.html#boost_asio.examples.http_server_3ブースト:: ASIOの同時実行

は、マルチスレッドサーバー実装することになっています。

ここで、async_readハンドラでは、メッセージを出力して30秒間スリープします。私は2つのブラウザでlocalhostを開き、handle_readが一度呼び出され、次に30秒間何も起こらず、最後にhandle_readが2度目に呼び出されることがわかります。

io_Service.runは5つのスレッドで呼び出されます。

ハンドラが同時に呼び出されないのはなぜですか?例えばなぜ、最初のhandle_readが終了するのを待ってから2番目の呼び出しを呼び出すのですか?

+3

あなたのコードを教えてください。私の賭けはあなたが*睡眠の後*まで*新しいリスナーを登録しないということです。 –

+0

BEFOREスリープから新しい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) 
    { 

期待どおりに動作しますが、それはあなたの「30秒スリープ」するにはどうすればよい

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

のですか?おそらく、使用したスリープ関数は、プロセス内のすべてのスレッドを一時停止しますか?

関連する問題