我开始使用PPL创建任务并将它们[可能]发送到其他线程,如下所示:
Concurrency::task_group tasks;
auto simpleTask = Concurrency::make_task(&simpleFunction);
tasks.run(simpleTask);
我尝试了一个每秒创建一个任务的小应用程序。任务在5秒内执行繁重的计算,然后停止。
我想知道PPL在我的机器上创建了多少线程,以及机器的负载是否会影响线程数或分配给线程的任务。当我在12核机器上运行一个或多个应用程序实例时,我注意到了这一点:
我使用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默认情况下是否这样做,我的观察结果不正确。
编辑:我尝试启动我的测试应用程序的更多实例,虽然我的机器仍然响应很快(我在原始问题中错了)但我看不到应用程序减少了他们的同时数量动作。
答案 0 :(得分:2)
你问题的简短回答是“不”。默认的PPL调度程序和资源管理器将仅使用进程本地信息来决定何时创建/销毁线程。如the Patterns and Practices article on MSDN中所述:
资源管理器是一个跨越一个进程的单例。它 不会跨多个协调处理器资源 操作系统进程。如果您的应用程序使用多个 并发进程,您可能需要降低并发级别 在每个过程中都能达到最佳效率。
如果您愿意接受这种复杂性,您可能能够实现自定义调度程序/资源管理器,以获取简单的系统级性能读数(例如using the PDH functions)来实现您的目标。