5

io_serviceのpoll()/ poll_one()とrun()/ run_one()の違いを理解しようとしています。ドキュメントに記載されている違いは、poll()は、任意のハンドラーを実行するrun()とは対照的に、readyハンドラーを実行することです。

しかし、ブーストのドキュメントのどこにも「レディハンドラー」の定義を見つけることができませんでした。

この質問に対する有効な答えは、できればコード例を使用して、readyハンドラーとnon-readyハンドラーの違い、およびpoll()とrun()の実行方法の違いを示すことができるものです。

ありがとう。

4

2 に答える 2

11

「準備完了ハンドラー」は、実行する準備ができているハンドラーです。非同期呼び出しを発行した場合は、バックグラウンドで実行され、非同期呼び出しが完了するとハンドラーが準備完了になります。それ以前は、ハンドラーは保留中ですが、準備ができていません。

  • poll_one準備ができているハンドラーがあれば、それを 1 つ実行します。
  • pollすべての準備完了ハンドラーを実行しますが、保留中のハンドラーは実行しません。両方のポーリング バージョンは、ハンドラーの実行直後に戻ります。
  • run_oneレディ ハンドラがある場合はそれを実行し、そうでない場合は最初の保留中のハンドラがレディになるのを待ちます。つまり、ブロックします。
  • run準備完了または保留中のハンドラーがなくなるまで、実行して待機します。復帰後、io_servie は停止状態になります。

Boost::Asio : io_service.run() と poll() の比較、またはメインループに boost::asio を統合する方法も参照してください。

于 2013-01-29T08:31:31.950 に答える
6
int main()
{
    boost::asio::io_service io_service;
    boost::asio::deadline_timer timer(io_service);

    timer.expires_from_now(boost::posix_time::seconds(5));
    timer.async_wait([](const boost::system::error_code& err)
                     { std::cout << (err ? "error" : "okay")
                     ;});

    //io_service.poll_one(); 
    io_service.run_one();
}

を使用io_service.poll_one();すると、タイマーがまだ経過していないため、出力が表示されない可能性が高くなります。ready handler単に実行の準備ができているハンドルを意味します (タイマーが経過したときや操作が終了したときなど)。ただし、 io_service.run_one();この呼び出しを使用すると、タイマーが終了するまでブロックされ、ハンドラーが実行されます。

于 2013-01-29T08:49:11.497 に答える