0

たとえば、io_serviceを開始する正しいシーケンスとio_service::run()、アプリケーションの最初の非同期操作を理解しようとしていますasync_accept。ほとんどのブーストの例は、後者を最初に行うようですが、理由はわかりません。

ブーストドキュメントは次の点を示しています。

結果を取得するには、プログラムでio_service :: run()を呼び出す必要があります。未完了の非同期操作があるときにio_service::run()を呼び出すと、通常、最初の非同期操作を開始するとすぐに呼び出されます。

図から、非同期操作の結果はキューを介してio_serviceに伝達され、io_serviceがすでに実行されていない限り、このキューから結果を取得しないことがわかります。したがって、io_serviceを常に最初に開始する必要があると言うのは正しくありません。ドキュメントはそうではないことを暗示しているようです。誰か説明してもらえますか?

4

1 に答える 1

2

のような非同期操作async_acceptは、OSで非同期タスクを開始し、結果を(利用可能になるとすぐに)io_serviceのイベントキューに入れます。

io_service::run結果についてキューをポーリングし、それらの結果を渡すハンドラーを呼び出します。

非同期タスクがない場合、フェッチする結果はなく、結果を生成する可能性のある未処理の作業io_serviceもないため、単に戻ります。

したがって、必要な順序は次のとおりです。

  • 少なくとも1つの非同期タスクを開始します
  • io_service::runポーリングを開始するために呼び出す

一連のタスク全体を開始し、実行する作業が不足することのない単一の非同期タスクを開始することもできio_serviceます。

于 2012-09-26T20:18:51.600 に答える