web-dev-qa-db-ja.com

io_service、なぜ、どのように使用されますか?

Asioを学ぼうとしていますが、ウェブサイトの例に従っています。

Io_serviceが必要な理由と、それは正確に何をするのですか?非同期操作の実行中に他のほとんどすべての関数に送信する必要があるのはなぜですか。最初の「バインド」後にそれ自体を「作成」できないのはなぜですか。

38
Milan

Asioの_io_service_は、非同期関数を操作するためのファシリテーターです。非同期操作の準備ができると、_io_service_の実行中のスレッドの1つを使用してコールバックします。そのようなスレッドが存在しない場合は、独自の内部スレッドを使用して呼び出します。

操作を含むキューと考えてください。これらの操作は、実行時に、そのrun()またはrun_once()メソッドを呼び出したスレッドでのみ実行されること、またはソケットと非同期IOを処理するときにその内部スレッドでのみ実行されることを保証します。

全員に渡さなければならない理由は、基本的に誰かが非同期操作の準備ができるまで待つ必要があるためです。独自のドキュメントに記載されているように、_io_service_はオペレーティングシステムのI/OサービスへのASIOのリンクであるため、 kqueue、_/dev/pool/_、epollなどのプラットフォーム独自の非同期通知機能、およびselect()などのそれらを操作するメソッド。

主に、io_serviceを使用してシステムの複数の部分からのコールバックを逆多重化し、それらが同じスレッドで動作することを確認します。操作はシリアル化されるため、明示的なロックは不要です。これは、非同期アプリケーションにとって非常に強力なイディオムです。

コアドキュメント を見ると、_io_service_が必要な理由とその機能をよりよく理解できます。

52
Edu Felipe