2012-11-04 11 views

答えて

9

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

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

+0

reset()のように破棄しますか? – lucastamoios

+2

通常、shared_ptrを使用して動作する場合、私はshared_ptrに対して 'reset()'を呼び出します。 –

6

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

io_service::runはすぐに行うには多くの作業がないよう返すので、いくつかの生産者と消費者のスレッドを持つアプリケーションを検討し、生産者は時折作品を制作しますio_service::postでコンシューマスレッドにポストしますが、すべての作業が終了した場合はio_service::runが返され、コンシューマスレッドが停止する可能性があります。io_serviceをビジー状態に保つために任意の作業が必要な場合は、io_service::workを直接使用できます。

関連する問題