ThreadPool オブジェクトが使用するプロセッサの数を制限する方法はありますか? ドキュメントによると、「ワーカー スレッドの数または I/O 完了スレッドの数を、コンピューター内のプロセッサの数よりも小さい数に設定することはできません。」
では、すべてのプロセッサを消費しないようにプログラムを制限するにはどうすればよいでしょうか?
ThreadPool オブジェクトが使用するプロセッサの数を制限する方法はありますか? ドキュメントによると、「ワーカー スレッドの数または I/O 完了スレッドの数を、コンピューター内のプロセッサの数よりも小さい数に設定することはできません。」
では、すべてのプロセッサを消費しないようにプログラムを制限するにはどうすればよいでしょうか?
スレッドプールは、スレッドの手動管理のすべての頭痛の種を取り除くために特別に設計されました。OSタスクスケジューラは長年にわたって取り組んできており、実行するタスクのスケジューリングで非常に優れた仕事をしています。スレッドの優先順位、メモリの場所、プロセッサへの近さなど、スケジューラが考慮する複数のオプションがあります。これらのプロセスを深く理解していない限り、スレッドアフィニティを設定することをお勧めします。
ドキュメントを引用する場合
スレッドアフィニティは、スレッドをプロセッサの特定のサブセットで実行するように強制します。スレッドアフィニティの設定は、プロセッサ間でスレッドを効果的にスケジュールするスケジューラの機能を妨げる可能性があるため、通常は避ける必要があります。これにより、並列処理によって得られるパフォーマンスの向上が低下する可能性があります。スレッドアフィニティの適切な使用法は、各プロセッサをテストすることです。
Thread
ただし、アフィニティを設定することは可能です(関連する投稿)。そのためには、独自のスレッドオブジェクト(スレッドプールからのオブジェクトではない)を作成する必要があります。私の限られた知識では、プールからのスレッドにスレッドアフィニティを設定することはできません。
SetMaxThreads では no を設定できないため。いいえよりも低いスレッドの数。プロセッサの正味の最善の策は、タスクをキューに入れることによって同時実行性を制限する TPL で独自の TaskScheduler を作成することです。そして、アイテムをスレッドプールに追加する代わりに、そのスケジューラーでタスクを作成できます。
「方法: 同時実行の程度を制限するタスク スケジューラを作成する」を参照 してください。
通常、スレッドプールを制限するのではなく、プログラムが一度に生成するスレッドの数を調整します。Task Parallel Libraryを使用すると、MaxDegreeOfParallelismを設定したり、 Semaphoreを使用したりできます。