0

私のアプリでは、優先順位に従って非同期に処理したいさまざまなイベントを受け取ります。

でこれを行うことができますboost::asio::io_serviceが、私のアプリケーションはシングルスレッドです。ロックにお金を払いたくないmallocsので、マルチスレッドプログラムが必要になるかもしれません (パフォーマンスコストは私にとって本当に重要です)。私は基本的にboost::asio::io_service、シングルスレッド実行用に書かれた を探しています。

を使用してこれを自分で実装できると確信していますが、実装する前に、シングルスレッド実行用に記述されboost::coroutineた a のようなものが既に存在しますか? boost::asio::io_serviceすでにブーストライブラリのリストをスキャンしましたが、何も目立ちませんでした

4

2 に答える 2

2

Asio の非ブロッキング呼び出しを使用するとすぐに、同期の料金を支払う必要あることに注意してください。

単一のスレッドを使用して作業をスケジュールし、結果のコールバックを処理する場合でも、非同期呼び出しを実行するために、Asio は内部で追加のスレッドを生成する必要がある場合があります。それらはio_service同時にアクセスします。

ソケット上の を考えてみてくださいasync_read。受信したデータが利用可能になるとすぐに、ソケットは に通知する必要がありますio_service。これはメインスレッドと同時に発生するため、追加の同期が必要です。

I/O をブロックする場合、この問題は理論上は解消されますが、非同期 I/O はライブラリの要点のようなものであるため、実装でこのケースの最適化が多すぎるとは思わないでしょう。

すでにコメントで指摘されているように、メイン スレッドが 1 つだけの場合、 での競合はio_service非常に少ないため、プロファイリングで明確なパフォーマンスのボトルネックが示されない限り、あまり心配する必要はありません。

于 2014-09-18T09:06:50.540 に答える
1

boost::asio を boost::coroutine -> boost::asio::yield_context と一緒に使用することをお勧めします (すでにコルーチンと io_service の結合を行っています)。優先度の高いタスクを検出した場合は、現在のタスクを一時停止して、優先度の高いタスクの処理を開始できます。問題は、条件 (キューに入れられた優先度の高いタスク) が与えられた場合にタスクを一時停止するために、タスクのコードで特定のチェックポイントを定義/呼び出す必要があることです。

于 2014-09-18T06:29:52.350 に答える