次のように、PPL を使用してタスクを作成し、[おそらく] 他のスレッドにディスパッチし始めています。
Concurrency::task_group tasks;
auto simpleTask = Concurrency::make_task(&simpleFunction);
tasks.run(simpleTask);
毎秒タスクを作成する小さなアプリケーションを試してみました。タスクは 5 秒間重い計算を実行し、その後停止します。
PPL が自分のマシンで作成するスレッドの数と、マシンの負荷がスレッドの数またはスレッドに割り当てられるタスクに影響するかどうかを知りたいと思っていました。12 コア マシンでアプリケーションの 1 つ以上のインスタンスを実行すると、次のことに気付きます。
- 1 つのアプリケーションを実行すると、6 つのスレッドが作成されます。合計 CPU 使用率は 50% です。
- 2 つのアプリケーションを実行すると、どちらも 6 つのスレッドを作成します。合計 CPU 使用率は 100% ですが、マシンの応答性は良好です。
- 3 つのアプリケーションを実行すると、すべてのアプリケーションで 6 つのスレッドが作成されます (合計で既に 18 スレッド)。合計 CPU 使用率は 100% です。
- 4 つのアプリケーションを実行すると、合計 24 のスレッドが既に存在します。
Process Explorer を使用して実行中のアプリケーションを調査したところ、4 つのアプリケーションですべて 6 つ (場合によっては 12) のスレッドがあり、すべてができるだけ多くの CPU を消費しようとしていることが明確にわかりました。
PPL では、次のようにデフォルトのスケジューラを構成することで、スレッドの数を制限できます。
Concurrency::SchedulerPolicy policy(1, Concurrency::MaxConcurrency,2);
Concurrency::Scheduler::SetDefaultSchedulerPolicy(policy);
これにより、スレッドの数を静的に制限します (この場合は 2)。24 コアのサーバーに 10 人の同時ユーザーがいることが事前にわかっていれば便利ですが (したがって、すべてのアプリケーションを 2 スレッドに制限できます)、10 人のユーザーのうちの 1 人が遅くまで作業している場合でも、彼は 2 つのスレッドしか使用しません。マシンの残りの部分がアイドリングしている間。
私の質問: PPL を構成して、マシンの負荷に基づいて作成する (または維持するかアクティブにする) スレッドの数を動的に決定する方法はありますか? または、PPL は既にデフォルトでこれを行っており、私の観察は正しくありません。
編集:テストアプリケーションのインスタンスをさらに開始しようとしましたが、マシンは非常に応答性が高いままですが(元の質問では間違っていました)、アプリケーションが同時アクションの数を減らしているのを確認できません。