7

私はブーストプログラミングに不慣れで、を使用する理由を探していましたがio_service::work、それを理解することはできません。いくつかのテストでは、それを削除して正常に動作しました。

4

2 に答える 2

11

io_service::run()実行する非同期操作がある限り、は操作を実行します。保留中の非同期操作(または呼び出されているハンドラー)がない場合はいつでも、run()呼び出しが返されます。

run()ただし、すべての作業が完了し、終了io_serviceしても問題がないことを明示的に指示されるまで、呼び出しを終了しないことを希望する設計がいくつかあります。それio_service::workが使用されているものです。オブジェクトを作成することによりwork(私は通常、ヒープとshared_ptrで作成します)、io_serviceは常に何かが保留中であると見なすため、run()メソッドは返されません。サービスを終了できるようにしたら(通常はシャットダウン中)、作業オブジェクトを破棄します。

于 2012-11-04T14:24:40.303 に答える
7

io_service::workは、のインスタンスに投稿できるすべての作業の基本クラスです。io_serviceたとえば、ソケットを使用して非同期読み取りを開始する場合、実際にはにを追加しworkますio_service。したがって、通常はwork直接使用することはありませんが、これには1つの例外があります。

io_service::runやるべき仕事がなくなるとすぐに戻ってくるので、プロデューサースレッドとコンシューマースレッドがいくつかあるアプリケーションを考えてみましょう。プロデューサーは時々作品を作成し、を使ってコンシューマースレッドに投稿しますio_service::postが、すべての作品が終了io_service::runすると、戻ってきて、おそらくあなたのコンシューマーになりますスレッドが停止するので、io_serviceビジー状態を維持するために任意の作業が必要です。この場合、io_service::work直接使用できます。

于 2012-11-04T14:27:00.193 に答える