web-dev-qa-db-ja.com

Boost :: Asio:io_service.run()vs poll()またはメインループにboost :: asioを統合する方法

私は現在、いくつかの単純なtcpネットワーキングのためにboost :: asioを初めて使用しようとしていますが、対処方法が本当にわからないものに出会いました。私が理解している限り、io_service.run()メソッドは基本的にループであり、実行する必要がなくなるまで実行されます。つまり、小さなサーバーオブジェクトを解放するまで実行されます。すでに何らかのメインループが設定されているので、単純にするためにそこからネットワークループを手動で更新したいと思います。io_service.poll()は、次のように、私がやりたいことを実行すると思います。

void myApplication::update()
{
     myIoService.poll();
     //do other stuff
}

これは機能しているようですが、この方法には、boost :: asios ioサービスを処理するための一般的な方法ではないので、この方法には欠点があるのか​​どうか疑問に思っています。これは有効なアプローチですか、それとも非ブロッキングの余分なスレッドでio_service.run()を使用する必要がありますか?

32
moka

io_service::pollの代わりにio_service::runを使用しても問題ありません。違いは ドキュメント で説明されています

Poll()関数は、準備完了ハンドラをディスパッチするためにも使用できますが、ブロックはしません。

キューに残っている work がある場合、io_service::runはブロックすることに注意してください

作業クラスは、作業の開始と終了をio_serviceに通知するために使用されます。これにより、作業の進行中にio_serviceオブジェクトのrun()関数が終了せず、未完了の作業が残っていないときに終了します。

io_service::pollはこの動作を示しませんが、readyハンドラーを呼び出すだけです。また、io_service:runまたはio_service::pollへの後続の呼び出しで io_service :: reset を呼び出す必要があることにも注意してください。

41
Sam Miller

欠点は、ビジーループを作成することです。

_while(true) {
    myIoService.poll()
}
_

100%cpuを使用します。 myIoService.run()は、0%のCPUを使用します。

myIoService.run_one()は必要な処理を実行する可能性がありますが、実行する処理がない場合はブロックされます。

3
Kurt