计划组

本文档介绍并发运行时中计划组的角色。 计划组将相关任务关联在一起或进行分组。 每个计划程序都有一个或多个计划组。 当你需要在任务之间处于较高位置时(例如,当一组相关的任务受益于在相同的处理器节点上执行操作时),可使用计划组。 相反,当应用程序具有特定质量要求时,例如,当希望限制分配给一组任务的处理资源量时,请使用计划程序实例。 有关计划程序实例的详细信息,请参阅计划程序实例

提示

并发运行时提供了一个默认计划程序,因此无需在应用程序中创建一个。 由于任务计划程序有助于优化应用程序的性能,如果你刚开始接触并发运行时,建议从使用并行模式库 (PPL)异步代理库开始。

每个 Scheduler 对象对于每个计划节点都有一个默认的计划组。 计划节点映射到基础系统拓扑。 运行时为每个处理器包或非统一内存体系结构 (NUMA) 节点创建一个计划节点,以较大的数为准。 如果不显式将任务与计划组关联,计划程序将选择要向其添加任务的组。

SchedulingProtocol 计划程序策略会影响计划程序在每个计划组中执行任务的顺序。 当 SchedulingProtocol 设置为 EnhanceScheduleGroupLocality(默认值)时,任务计划程序将在当前任务完成或以协作方式暂停时从它正在处理的计划组中选择下一个任务。 任务计划程序会在移动到下一个可用组之前搜索当前计划组的工作。 相反,当 SchedulingProtocol 设置为 EnhanceForwardProgress 时,计划程序会在每个任务完成或暂停后移动到下一个计划组。 有关比较这些策略的示例,请参阅如何:使用计划组影响执行顺序

运行时使用 concurrency::ScheduleGroup 类表示计划组。 若要创建 ScheduleGroup 对象,请调用 concurrency::CurrentScheduler::CreateScheduleGroupconcurrency::Scheduler::CreateScheduleGroup 方法。 运行时使用引用计数机制来控制 ScheduleGroup 对象的生存期,就像对 Scheduler 对象所做的那样。 创建 ScheduleGroup 对象时,运行时会将引用计数器设置为 1。 concurrency::ScheduleGroup::Reference 方法将引用计数器递增 1。 concurrency::ScheduleGroup::Release 方法将引用计数器递减 1。

并发运行时中的许多类型允许将对象与计划组关联。 例如,concurrency::agent 类和消息块类(如 concurrency::unbounded_bufferconcurrency::join 和 concurrency::timer)可提供采用 ScheduleGroup 对象的构造函数的重载版本。 运行时使用与此 ScheduleGroup 对象关联的 Scheduler 对象来计划任务。

还可以使用 concurrency::ScheduleGroup::ScheduleTask 方法来计划轻量级任务。 有关轻量级任务的详细信息,请参阅轻量级任务

示例

有关使用计划组控制任务执行顺序的示例,请参阅如何:使用计划组影响执行顺序

另请参阅

任务计划程序
计划程序实例
如何:使用计划组影响执行顺序