私は現在、いくつかの単純なtcpネットワーキングのためにboost :: asioを初めて使用しようとしていますが、対処方法が本当にわからないものに出会いました。私が理解している限り、io_service.run()メソッドは基本的にループであり、実行する必要がなくなるまで実行されます。つまり、小さなサーバーオブジェクトを解放するまで実行されます。すでに何らかのメインループが設定されているので、単純にするためにそこからネットワークループを手動で更新したいと思います。io_service.poll()は、次のように、私がやりたいことを実行すると思います。
void myApplication::update()
{
myIoService.poll();
//do other stuff
}
これは機能しているようですが、この方法には、boost :: asios ioサービスを処理するための一般的な方法ではないので、この方法には欠点があるのかどうか疑問に思っています。これは有効なアプローチですか、それとも非ブロッキングの余分なスレッドでio_service.run()を使用する必要がありますか?
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 を呼び出す必要があることにも注意してください。
欠点は、ビジーループを作成することです。
_while(true) {
myIoService.poll()
}
_
100%cpuを使用します。 myIoService.run()
は、0%のCPUを使用します。
myIoService.run_one()
は必要な処理を実行する可能性がありますが、実行する処理がない場合はブロックされます。