1

ネットワーク接続を表すためにラッパー クラスを使用しています。私の実装にはasync_connect()、ホスト/サービスを解決し、関連するエンドポイント (可能な場合) に接続する というメソッドが含まれています。このようなもの:

void tcp::connection::async_connect(std::string const& host, std::string const& service,
    protocol_type tcp = protocol_type::v4())
{
    std::cout << "thread [" << boost::this_thread::get_id() << "] tcp::connection::async_connect()" << std::endl;

    resolver(m_io_service).async_resolve(resolver::query(tcp, host, service),
        boost::bind(&connection::resolve_handler, this, _1, _2));
}

私が知りたいのは、async_resolveメソッドの完了によって呼び出されるハンドラーからの接続を確立することです。

メインスレッドとワーカースレッドのどちらを使用してハンドラーを呼び出すかはわかりません。したがって、呼び出す必要がありますsocket::connect()(そのコードがワーカー スレッドから実行される場合、これが最も賢明な方法です) か、非同期操作を再度開始する必要があります ( socket::async_connect()- これは、メイン スレッドによって実行されるときに使用する必要があります)。

void tcp::connection::resolve_handler(boost::system::error_code const& resolve_error,
    tcp::resolver::iterator endpoint_iterator)
{
    std::cout << "thread [" << boost::this_thread::get_id() << "] tcp::connection::resolve_handler()" << std::endl;

    if (!resolve_error)
    {
        boost::system::error_code ec;
        m_socket.connect(*endpoint_iterator, ec);
    }
}

コンソール出力resolve_handlerから、 my がワーカー スレッドから呼び出されていることを確認しました。では、こちらに電話してもよろしいsocket::connect()でしょうか?

4

1 に答える 1

2

IMO asioを使用する場合は、単一のプログラミングモデルに固執することをお勧めします。

asioの同期(ブロッキング)呼び出しを自由に使用できます。この場合、いくつかのメソッド(resolve、connectなど)を呼び出し、結果またはエラーが利用可能になるまで、それぞれがブロックします。

ただし、非同期プログラミングモデルを使用している場合、メインスレッドまたは呼び出しスレッドは通常io_service :: runでブロックされ、指定されたハンドラーは別のスレッドから呼び出されます(説明した場合のように)。このプログラミングモデルを使用する場合、通常はハンドラー(ワーカースレッド)から次の非同期メソッドを呼び出すため、socket :: connectを呼び出す代わりに、socket::async_connectを呼び出します。あなたが2つの異なるモデルを混ぜようとしているように私には見えます。2つのモデルを(io_service :: runでブロックされた呼び出しスレッドで)混合し、ハンドラーから同期メソッドを呼び出すことの意味がわかりません。

于 2011-10-02T08:24:35.750 に答える