计划程序策略

本文档介绍并发运行时中计划程序策略的角色。 计划程序策略能控制计划程序在管理任务时使用的策略。 例如,假设一个应用程序需要某些任务在 THREAD_PRIORITY_NORMAL 上执行,而其他任务在 THREAD_PRIORITY_HIGHEST 上执行。 您可以创建两个计划程序实例:一个指定 ContextPriority 策略为 THREAD_PRIORITY_NORMAL,另一个指定同一策略为 THREAD_PRIORITY_HIGHEST

通过使用计划程序策略,您可以划分可用处理资源并将一组固定的资源分配给每个计划程序。 例如,考虑采用不超过 4 个处理器的并行算法。 可以创建一个计划程序策略,以限制其任务并发使用不超过 4 个处理器。

提示

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

当使用 concurrency::CurrentScheduler::Createconcurrency::Scheduler::Createconcurrency::Scheduler::SetDefaultSchedulerPolicy 方法创建计划程序实例时,请提供包含指定计划程序行为的键值对集合的 concurrency::SchedulerPolicy 对象。 SchedulerPolicy 构造函数采用可变数量的参数。 第一个参数是要指定的策略元素数。 其余参数是每个策略元素的键值对。 以下示例创建 SchedulerPolicy 对象以指定三个策略元素。 运行时对未指定的策略键使用默认值。

SchedulerPolicy policy(3,       
   MinConcurrency, 2,
   MaxConcurrency, 4,
   ContextPriority, THREAD_PRIORITY_HIGHEST
);

concurrency::PolicyElementKey 枚举定义与任务计划程序关联的策略键。 下表描述了策略键以及运行时针对其中每个键使用的默认值。

策略键 说明 默认值
SchedulerKind concurrency::SchedulerType 值,该值指定用于计划任务的线程类型。 ThreadScheduler(使用正常线程)。 这是此键的唯一有效值。
MaxConcurrency unsigned int 值,该值指定计划程序使用的最大并发资源数。 concurrency::MaxExecutionResources
MinConcurrency unsigned int 值,该值指定计划程序使用的最小并发资源数。 1
TargetOversubscriptionFactor unsigned int 值,该值指定要分配给每个处理资源的线程数。 1
LocalContextCacheSize unsigned int 值,该值指定可在每个虚拟处理器的本地队列中缓存的最大上下文数。 8
ContextStackSize unsigned int 值,该值指定要为每个上下文保留的堆栈大小(以 KB 为单位)。 0(使用默认堆栈大小)
ContextPriority int 值,该值指定每个上下文的线程优先级。 这可以是可传递给 SetThreadPriorityINHERIT_THREAD_PRIORITY 的任何值。 THREAD_PRIORITY_NORMAL
SchedulingProtocol concurrency::SchedulingProtocolType 值,该值指定要使用的计划算法。 EnhanceScheduleGroupLocality
DynamicProgressFeedback concurrency::DynamicProgressFeedbackType 值,该值指定是否根据基于统计信息的进度信息来重新平衡资源。

附注 不要将此策略设置为 ProgressFeedbackDisabled,因为它是保留给运行时使用的。
ProgressFeedbackEnabled

每个计划程序在计划任务时使用自己的策略。 与一个计划程序关联的策略不影响任何其他计划程序的行为。 此外,创建 Scheduler 对象后无法更改计划程序策略。

重要

仅使用计划程序策略来控制运行时创建的线程的属性。 不要更改线程关联或运行时创建的线程的优先级,因为这可能会导致未定义的行为。

如果未显式创建计划程序,运行时会为你创建默认计划程序。 如果希望在应用程序中使用默认计划程序,但要为该计划程序指定要使用的策略,请在计划并行工作之前调用 concurrency::Scheduler::SetDefaultSchedulerPolicy 方法。 如果不调用 Scheduler::SetDefaultSchedulerPolicy 方法,运行时将使用表中的默认策略值。

使用 concurrency::CurrentScheduler::GetPolicyconcurrency::Scheduler::GetPolicy 方法可检索计划程序策略的副本。 从这些方法收到的策略值可能与创建计划程序时指定的策略值不同。

示例

若要检查使用特定计划程序策略控制计划程序行为的示例,请参阅 “如何:指定特定计划程序策略”“如何:创建使用特定计划程序策略的代理”

另请参阅

任务计划程序
如何:指定特定的计划程序策略
如何:创建使用特定计划程序策略的代理