计划程序策略
本文档介绍并发运行时中计划程序策略的角色。 计划程序策略控制计划程序在管理任务时使用的策略。 例如,假设的应用程序需要在执行某些任务THREAD_PRIORITY_NORMAL和其他任务在执行THREAD_PRIORITY_HIGHEST。 您可以创建两个计划程序实例: 一个指定ContextPriority策略被THREAD_PRIORITY_NORMAL ,它指定相同的策略是另一个THREAD_PRIORITY_HIGHEST。
通过使用计划程序策略,可以将划分的可用处理资源并将一组固定的资源分配给每个计划程序。 例如,请考虑一个作用范围不超过四个处理器的并行算法。 您可以创建一个计划程序策略,该策略将其任务限制为同时使用最多四个处理器。
提示
并发运行时提供的缺省调度程序。因此,您不必创建一个应用程序中。由于任务计划程序可帮助您优化应用程序的性能,因此,如果您初次接触并发运行时,则建议您先使用 并行模式库 (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 枚举定义与任务计划程序相关联的策略项。 下表描述策略键以及运行时对每个策略键使用的默认值。
策略键 |
说明 |
默认值 |
---|---|---|
SchedulerKind |
A concurrency::SchedulerType 的值,指定要使用计划任务的线程类型。 |
ThreadScheduler(使用正常的线程)。 这是唯一的有效值为此参数。 |
MaxConcurrency |
unsigned int 值,该值指定计划程序使用的并发资源的最大数量。 |
|
MinConcurrency |
unsigned int 值,该值指定计划程序使用的并发资源的最小数量。 |
1 |
TargetOversubscriptionFactor |
unsigned int 值,该值指定为每个处理资源分配了多少线程。 |
1 |
LocalContextCacheSize |
unsigned int 值,该值指定可在每个虚拟处理器的本地队列中缓存的上下文的最大数目。 |
8 |
ContextStackSize |
unsigned int 值,该值指定为每个上下文保留的堆栈的大小(以千字节为单位)。 |
0(使用默认堆栈大小) |
ContextPriority |
int 值,该值指定每个上下文的线程优先级别。 它可以是可传递给 SetThreadPriority 或 INHERIT_THREAD_PRIORITY 的任何值。 |
THREAD_PRIORITY_NORMAL |
SchedulingProtocol |
A concurrency::SchedulingProtocolType 的值,指定要使用的调度算法。 |
EnhanceScheduleGroupLocality |
DynamicProgressFeedback |
A concurrency::DynamicProgressFeedbackType 值,该值指定是否基于统计信息的进度信息根据资源的平衡。 注意不将此策略设置为ProgressFeedbackDisabled因为运行库保留供使用。 |
ProgressFeedbackEnabled |
每个计划程序在计划任务时使用其自己的策略。 与一个计划关联的策略不影响任何其他计划程序的行为。 另外,创建 Scheduler 对象后,则不能更改计划程序策略。
重要
仅使用计划程序策略控制运行时创建的线程的特性。不要更改线程关联或运行时,可能会导致未定义的行为,因为创建的线程的优先级。
如果您未显式创建计划程序,则运行时会为您创建一个默认计划程序。 如果您要使用的缺省调度程序在您的应用程序,但您希望指定一个策略,以便使用,调用该计划程序 concurrency::Scheduler::SetDefaultSchedulerPolicy 方法之前,计划并行工作。 如果您不调用 Scheduler::SetDefaultSchedulerPolicy 方法,则运行时将使用表中的默认策略值。
使用 concurrency::CurrentScheduler::GetPolicy 和 concurrency::Scheduler::GetPolicy 方法来获取计划程序策略的副本。 从这些方法接收的策略值可能不同于您在创建计划程序时指定的策略值。
示例
若要查看使用特定的计划程序策略控制调度程序的行为的示例,请参阅如何:指定特定的计划程序策略和如何:创建使用特定计划程序策略的代理。