私はブーストプログラミングに不慣れで、を使用する理由を探していましたがio_service::work
、それを理解することはできません。いくつかのテストでは、それを削除して正常に動作しました。
2 に答える
io_service::run()
実行する非同期操作がある限り、は操作を実行します。保留中の非同期操作(または呼び出されているハンドラー)がない場合はいつでも、run()
呼び出しが返されます。
run()
ただし、すべての作業が完了し、終了io_service
しても問題がないことを明示的に指示されるまで、呼び出しを終了しないことを希望する設計がいくつかあります。それio_service::work
が使用されているものです。オブジェクトを作成することによりwork
(私は通常、ヒープとshared_ptrで作成します)、io_serviceは常に何かが保留中であると見なすため、run()
メソッドは返されません。サービスを終了できるようにしたら(通常はシャットダウン中)、作業オブジェクトを破棄します。
io_service::work
は、のインスタンスに投稿できるすべての作業の基本クラスです。io_service
たとえば、ソケットを使用して非同期読み取りを開始する場合、実際にはにを追加しwork
ますio_service
。したがって、通常はwork
直接使用することはありませんが、これには1つの例外があります。
io_service::run
やるべき仕事がなくなるとすぐに戻ってくるので、プロデューサースレッドとコンシューマースレッドがいくつかあるアプリケーションを考えてみましょう。プロデューサーは時々作品を作成し、を使ってコンシューマースレッドに投稿しますio_service::post
が、すべての作品が終了io_service::run
すると、戻ってきて、おそらくあなたのコンシューマーになりますスレッドが停止するので、io_service
ビジー状態を維持するために任意の作業が必要です。この場合、io_service::work
直接使用できます。