本文介绍并发运行时中计划程序策略的角色。 计划程序策略能控制计划程序在管理任务时使用的策略。 例如,假设一个应用程序需要某些任务在 THREAD_PRIORITY_NORMAL 上执行,而其他任务在 THREAD_PRIORITY_HIGHEST 上执行。 您可以创建两个计划程序实例:一个指定 ContextPriority 策略为 THREAD_PRIORITY_NORMAL,另一个指定同一策略为 THREAD_PRIORITY_HIGHEST。
通过使用计划程序策略,您可以划分可用处理资源并将一组固定的资源分配给每个计划程序。 例如,考虑采用不超过 4 个处理器的并行算法。 可以创建一个计划程序策略,以限制其任务并发使用不超过 4 个处理器。
并发运行时提供默认计划程序。 因此,不必在应用程序中创建计划程序。 由于任务计划程序有助于优化应用程序的性能,如果你刚开始接触并发运行时,建议从使用并行模式库 (PPL) 或异步代理库开始。
当使用 concurrency::CurrentScheduler::Create、concurrency::Scheduler::Create 或 concurrency::Scheduler::SetDefaultSchedulerPolicy 方法创建计划程序实例时,请提供包含指定计划程序行为的键值对集合的 concurrency::SchedulerPolicy 对象。 SchedulerPolicy 构造函数采用可变数量的参数。 第一个参数是要指定的策略元素数。 其余参数是每个策略元素的键值对。 以下示例创建 SchedulerPolicy 对象以指定三个策略元素。 运行时对未指定的策略键使用默认值。
SchedulerPolicy policy(3, MinConcurrency, 2,MaxConcurrency, 4,ContextPriority, THREAD_PRIORITY_HIGHEST
);
concurrency::PolicyElementKey 枚举定义与任务计划程序关联的策略键。 下表描述了策略键以及运行时针对其中每个键使用的默认值。
每个计划程序在计划任务时使用自己的策略。 与一个计划程序关联的策略不影响任何其他计划程序的行为。 此外,创建 Scheduler 对象后无法更改计划程序策略。
仅使用计划程序策略来控制运行时创建的线程的属性。 不要更改线程关联或运行时创建的线程的优先级,因为这可能会导致未定义的行为。
如果未显式创建计划程序,运行时会为你创建默认计划程序。 如果希望在应用程序中使用默认计划程序,但要为该计划程序指定要使用的策略,请在计划并行工作之前调用 concurrency::Scheduler::SetDefaultSchedulerPolicy 方法。 如果不调用 Scheduler::SetDefaultSchedulerPolicy 方法,运行时将使用表中的默认策略值。
使用 concurrency::CurrentScheduler::GetPolicy 和 concurrency::Scheduler::GetPolicy 方法可检索计划程序策略的副本。 从这些方法收到的策略值可能与创建计划程序时指定的策略值不同。