1

新しい接続用に新しい std::thread を起動するメソッドがあるので、データを読み取ったり、他のことを実行したりできます。スレッドが呼び出すメソッドは、(boost 関数を使用して) 非同期の方法で読み取りを実行し、呼び出すと返されますasync_read_some。私の質問は次のとおりです。

コールバックを処理するスレッドは? への呼び出しを行ったのは同じスレッドですか、async_read_someそれとも呼び出して戻った後にそのスレッドが終了し、現在はメインスレッドが読み取りを処理していますか?

コード スニペットを次に示します。

    connection::connection_thread = std::thread(&connection::read_header,
                                                 this);
    connection::connection_thread.detach();
               .
               .
               .
  void connection::read_header() {
    socket_.async_read_some(boost::asio::buffer(headbuf_),
      strand_.wrap(
        boost::bind(&connection::on_header_read, shared_from_this(),
          boost::asio::placeholders::error,
          boost::asio::placeholders::bytes_transferred)));
    begin_timeout();
  }
4

1 に答える 1

1

コールバックを処理するスレッドは?

関連するio_service. ハンドラーはサービスに渡され、完了時に呼び出されます。

async_read_some を呼び出したのと同じスレッドです。

いいえ、async関数がハンドラを直接呼び出すことはありません。io_service操作がすぐに完了した場合でも、常に によって呼び出されます。

または、そのスレッドが呼び出されて返された後にそのスレッドが終了し、現在はメインスレッドが読み取りを処理していますか?

それは、スレッドの管理方法に完全に依存します。async必要がなくなった場合、呼び出したスレッドは終了する可能性があります。io_service非同期操作を処理して完了するには、他のスレッド (メイン スレッド、場合によっては他のスレッド) が必要になります。

ただし、スレッドを起動して非同期操作を開始しても意味がありません。非同期操作はすぐに完了するためです。async_read_some現在スレッドを起動している場所に呼び出しを移動します。または、スレッドを使用して同期操作を実行します。マルチスレッド同期設計を選択した場合、io_service非同期操作のためにスレッドをポーリングする必要はありません。

于 2013-09-10T16:45:02.917 に答える