PPL是否在创建线程时考虑系统负载?

时间:2014-11-28 09:45:51

标签: visual-studio-2013 ppl

我开始使用PPL创建任务并将它们[可能]发送到其他线程,如下所示:

Concurrency::task_group  tasks;
auto simpleTask = Concurrency::make_task(&simpleFunction);
tasks.run(simpleTask);

我尝试了一个每秒创建一个任务的小应用程序。任务在5秒内执行繁重的计算,然后停止。

我想知道PPL在我的机器上创建了多少线程,以及机器的负载是否会影响线程数或分配给线程的任务。当我在12核机器上运行一个或多个应用程序实例时,我注意到了这一点:

  • 运行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个用户中的一个工作到很晚,他仍然只使用2个线程,而机器的其余部分都是闲置的。

我的问题:有没有办法配置PPL,以便根据机器的负载动态决定要创建多少线程(或保持活动或保持活动状态)?或者PPL默认情况下是否这样做,我的观察结果不正确。

编辑:我尝试启动我的测试应用程序的更多实例,虽然我的机器仍然响应很快(我在原始问题中错了)但我看不到应用程序减少了他们的同时数量动作。

1 个答案:

答案 0 :(得分:2)

你问题的简短回答是“不”。默认的PPL调度程序和资源管理器将仅使用进程本地信息来决定何时创建/销毁线程。如the Patterns and Practices article on MSDN中所述:

  

资源管理器是一个跨越一个进程的单例。它   不会跨多个协调处理器资源   操作系统进程。如果您的应用程序使用多个   并发进程,您可能需要降低并发级别   在每个过程中都能达到最佳效率。

如果您愿意接受这种复杂性,您可能能够实现自定义调度程序/资源管理器,以获取简单的系统级性能读数(例如using the PDH functions)来实现您的目标。