Я начинаю использовать PPL для создания задач и отправки их [возможно] другим потокам, например:
Concurrency::task_group tasks;
auto simpleTask = Concurrency::make_task(&simpleFunction);
tasks.run(simpleTask);
Я экспериментировал с небольшим приложением, которое каждую секунду создает задачу. Задача выполняет тяжелые вычисления в течение 5 секунд, а затем останавливается.
Я хотел знать, сколько потоков PPL создает на моей машине, и влияет ли загрузка машины на количество потоков или задачи, назначенные потокам. Когда я запускаю один или несколько экземпляров своего приложения на своей 12-ядерной машине, я замечаю следующее:
- При запуске 1 приложения создается 6 потоков. Общая загрузка ЦП составляет 50%.
- При запуске 2 приложений оба создают по 6 потоков. Общая загрузка ЦП составляет 100%, но моя машина остается довольно отзывчивой.
- При запуске 3 приложений все они создают 6 потоков (всего уже 18 потоков). Общая загрузка ЦП составляет 100%.
- При запуске 4 приложений у меня всего уже 24 потока.
Я исследовал запущенные приложения с помощью Process Explorer, и с помощью 4 приложений я ясно вижу, что все они имеют 6 (иногда даже 12) потоков, которые все пытаются использовать как можно больше ЦП.
PPL позволяет ограничить количество потоков, настроив планировщик по умолчанию, например:
Concurrency::SchedulerPolicy policy(1, Concurrency::MaxConcurrency,2);
Concurrency::Scheduler::SetDefaultSchedulerPolicy(policy);
Таким образом вы статически ограничиваете количество потоков (в данном случае 2). Это может быть удобно, если вы заранее знаете, что на сервере с 24 ядрами одновременно работают 10 пользователей (так что вы можете ограничить каждое приложение двумя потоками), но если один из 10 пользователей работает поздно, он по-прежнему использует только 2 потока, в то время как остальная часть машины находится на холостом ходу.
Мой вопрос: есть ли способ настроить PPL так, чтобы он динамически решал, сколько потоков создать (или сохранить или оставить активными) в зависимости от нагрузки на машину? Или PPL уже делает это по умолчанию, и мои наблюдения неверны.
ИЗМЕНИТЬ: я попытался запустить больше экземпляров своего тестового приложения, и, хотя моя машина остается достаточно отзывчивой (я ошибся в исходном вопросе), я не вижу, чтобы приложения уменьшали количество одновременных действий.