计划组
本文档介绍并发运行时中计划组的作用。 计划组可将相关的任务关联或分组在一起。 每个计划程序都具有一个或多个计划组。 当您需要在任务之间处于较高位置时(例如,当一组相关的任务受益于在相同的处理器节点上执行操作时),可使用计划组。 相反,如果您的应用程序具有特定的质量要求(例如当您想要限制指派给一组任务的处理资源的数量时),请使用计划程序实例。 有关计划程序实例的更多信息,请参见计划程序实例。
提示
并发运行时提供默认的计划程序,因此您不需要在应用程序中再创建一个计划程序。由于任务计划程序可帮助您优化应用程序的性能,因此,如果您初次接触并发运行时,则建议您先使用 并行模式库 (PPL) 或 异步代理库。
每个 Scheduler 对象对于每个计划节点都有一个默认计划组。 计划节点映射到基础系统拓扑。 运行时为每个处理器包创建一个计划节点,或创建一个非统一内存体系结构 (NUMA) 节点(数字较大者优先)。 如果您没有将某个任务与计划组显式关联,则计划程序会选择将该任务添加到哪个组。
SchedulingProtocol 计划程序策略会影响计划程序执行每个计划组中的任务的顺序。 如果 SchedulingProtocol 设置为 EnhanceScheduleGroupLocality(这是默认值),则任务计划程序在当前任务完成或协作让出资源时,将从它正在工作的计划组中选择下一个任务。 任务计划程序在移到下一个可用组之前,在当前计划组中搜索工作。 相反,如果 SchedulingProtocol 设置为 EnhanceForwardProgress,则计划程序在每个任务完成或让出资源后移动到下一个计划组。 有关比较这些策略的示例,请参见如何:使用计划组影响执行顺序。
运行库使用 concurrency::ScheduleGroup 类,用于表示计划组。 若要创建ScheduleGroup对象,请调用 concurrency::CurrentScheduler::CreateScheduleGroup 或 concurrency::Scheduler::CreateScheduleGroup 方法。 运行时像对 Scheduler 对象一样,使用引用计数机制来控制 ScheduleGroup 对象的生存期。 当您创建 ScheduleGroup 对象时,运行时将引用计数器设置为一。 Concurrency::ScheduleGroup::Reference 方法递增引用计数器之一。 Concurrency::ScheduleGroup::Release 方法可将一个引用计数器。
并发运行时中的许多类型都允许您将对象与计划组关联。 例如, concurrency::agent 类和消息块类如 concurrency::unbounded_buffer, concurrency::join,和 concurrency::timer,提供了构造函数的重载的版本的ScheduleGroup对象。 运行时使用与此 ScheduleGroup 对象关联的 Scheduler 对象来计划任务。
您还可以使用 concurrency::ScheduleGroup::ScheduleTask 计划任务轻量的方法。 有关轻量级任务的更多信息,请参见轻量级任务。
示例
有关使用计划组控制任务执行顺序的示例,请参见如何:使用计划组影响执行顺序。