3

実行中の asio サービスは、スレッドが順次実行されるタスクを投稿するために使用できるキューのようなものだと理解しています。ただし、どのキューもそうであるように、制限があると思います。asio サービスにこの制限を設定することは可能ですか? キューがいっぱいになったときにどのポリシーに従うかを設定することはできますか (つまり、ブロック、非ブロックなど)?

アップデート

asio::service を実行するスレッドと、このスレッドに 10ms ごとにタスクを投稿するタイマーがあるとします。タスクの受信は、スレッドを 100 ミリ秒スリープ状態にするメソッド呼び出しにバインドされます。したがって、毎秒 10 個のタスクを実行できるスレッドに、毎秒 100 個のタスクをポストするタイマーがあります。この状況が分岐することは明らかです。ただし、キューを処理する場合、通常、キューの深さ (100? 1000? エンキューされた投稿など) を測定したり、キューがいっぱいになったときに送信者が従うべきポリシー (つまり、待機するかドロップするか) を指定する手段があります。要求して続行しますか?)。私の質問は、これらの機能を asio::service に設定する方法です。

4

2 に答える 2

3

Asioは、内部データ構造を制御するためのポリシーを提供していません。ただし、ハンドラー割り当てへのフックは提供されます:asio_handler_allocateおよびasio_handler_deallocate。これらのフックをアプリケーションで使用して、未処理の非同期操作の量を制限したり、ユーザーが指定した制限に達したときの動作を定義したりできます。

考慮すべきいくつかの重要なポイントがあります。

  • asio_handler_allocate有効なメモリブロックを返すか、例外をスローすることが期待されます。から例外がスローされた場合、のasio_handler_allocateような呼び出しによってスタックの巻き戻しが続行されますio_service::post()。したがって、最大値に達したときの非ブロッキング動作の場合、スローが唯一のオプションである可能性があります。
  • 、などの構成された操作への影響を考慮してくださいasync_read。ここで、asio_handler_allocateおよびasio_handler_deallocateは複数回呼び出される場合があります。例外がスローされた場合、スレッドのスタックは少なくともio_service::run呼び出された時点まで巻き戻されます。ブロッキングが発生した場合、reactorにサービスを提供しているすべてのスレッドがブロックされ、本質的にすべての非同期ジョブが完了しなくなる可能性があります。

これは、ハンドラーに使用されているメモリプールを示すBoost.Asioの例からの割り当ての例です。

于 2012-08-01T13:34:28.743 に答える
2

私が知っているものはありません。あなたの例としてio_serviceは、長時間実行されるタスクを実行し、作業が完了するとそれ自体を再スケジュールするタイマーをスレッドに含める方がはるかに良いでしょう。そうしないと、キューをクリーンアップできません。また、適切なタイミング制約のあるリアルタイムシステムが必要な場合は、汎用OS/プログラミングもboost.asioもタスクに対応していません。

于 2012-07-31T22:07:36.360 に答える