计划程序实例
本文档描述的角色,计划程序中的实例并发运行库以及如何使用 concurrency::Scheduler 和 concurrency::CurrentScheduler 来创建和管理计划程序实例的类。 当您想要将显式计划策略与特定类型的工作负载关联时,计划程序实例非常有用。 例如,您可以创建一个计划程序实例以提升的线程优先级运行部分任务,并使用默认计划程序以普通的线程优先级运行其他任务。
提示
并发运行时提供默认的计划程序,因此您不需要在应用程序中再创建一个计划程序。由于任务计划程序可帮助您优化应用程序的性能,因此,如果您初次接触并发运行时,则建议您先使用 并行模式库 (PPL) 或 异步代理库。
各节内容
Scheduler 和 CurrentScheduler 类
创建计划程序实例
管理计划程序实例的生存期
方法和功能
示例
Scheduler 和 CurrentScheduler 类
任务计划程序使应用程序能够使用一个或多个计划程序实例来计划工作。 Concurrency::Scheduler 类表示计划程序实例和封装到计划任务相关的功能。
附加到计划程序的线程称为“执行上下文”或简称为“上下文”。 在任意时间,当前上下文中只能有一个计划程序处于活动状态。 活动的计划程序也称为“当前计划程序”。 并发运行时将使用 concurrency::CurrentScheduler 类提供对当前计划程序的访问。 一个上下文的当前计划程序可以不同于另一个上下文的当前计划程序。 运行时不提供当前计划程序的进程级别表示形式。
通常,CurrentScheduler 类用于访问当前计划程序。 当您需要管理非当前的计划程序时,Scheduler 类很有用。
以下各节描述如何创建和管理计划程序实例。 有关演示这些任务的完整示例,请参见如何:管理计划程序实例。
Top
创建计划程序实例
可以使用下列三种方法创建 Scheduler 对象:
如果不存在计划程序,在您使用运行时功能(如并行算法)执行工作时,运行时将为您创建默认计划程序。 默认计划程序将成为启动并行工作的上下文的当前计划程序。
Concurrency::CurrentScheduler::Create 方法创建Scheduler使用一个特定的策略,并将该计划与当前上下文相关联的对象。
Concurrency::Scheduler::Create 方法创建Scheduler使用特定的策略,但不会不与关联的当前上下文的对象。
通过允许运行时创建默认计划程序,所有并发任务可以共享相同的计划程序。 通常,并行模式库 (PPL) 或异步代理库提供的功能用于执行并行工作。 因此,您不必直接使用计划程序来控制其策略或生存期。 当您使用 PPL 或代理库时,运行时将创建默认计划程序(如果它不存在),并使其成为每个上下文的当前计划程序。 如果您创建一个计划程序并将其设置为当前计划程序,则运行时使用该计划程序安排任务。 仅当需要特定的计划策略时,才创建额外的计划程序实例。 有关与计划程序关联的策略的更多信息,请参见计划程序策略。
Top
管理计划程序实例的生存期
运行时使用引用计数机制来控制 Scheduler 对象的生存期。
当您使用 CurrentScheduler::Create 方法或 Scheduler::Create 方法创建 Scheduler 对象时,运行时将该计划程序的初始引用计数设置为一。 运行时增加引用计数,当您调用 concurrency::Scheduler::Attach 方法。 Scheduler::Attach 方法可将 Scheduler 对象与当前上下文相关联。 这使它成为当前计划程序。 当您调用 CurrentScheduler::Create 方法时,运行时创建 Scheduler 对象并将其附加到当前上下文(且将引用计数设置为一)。 您还可以使用 concurrency::Scheduler::Reference 方法,以增加引用计数的Scheduler对象。
运行时递减的引用计数调用时 concurrency::CurrentScheduler::Detach 若要取消当前的计划程序,方法调用或 concurrency::Scheduler::Release 方法。 当引用计数达到零时,运行时将在所有计划任务完成后销毁 Scheduler 对象。 允许正在运行的任务递增当前计划程序的引用计数。 因此,如果引用计数达到零而任务递增引用计数,在引用计数再次达到零和所有任务完成之前,运行时不会销毁 Scheduler 对象。
运行时为每个上下文维护一个内部 Scheduler 对象堆栈。 当您调用 Scheduler::Attach 或 CurrentScheduler::Create 方法时,运行时将该 Scheduler 对象推送到当前上下文的堆栈上。 这使它成为当前计划程序。 当您调用 CurrentScheduler::Detach 时,运行时从当前上下文的堆栈弹出当前计划程序,并将上一个计划程序设置为当前计划程序。
运行时提供了几种方法来管理计划程序实例的生存期。 下表针对在当前上下文中创建或附加计划程序的每个方法,显示了从当前上下文释放或分离计划程序的相应方法。
创建或附加方法 |
释放或分离方法 |
---|---|
CurrentScheduler::Create |
CurrentScheduler::Detach |
Scheduler::Create |
Scheduler::Release |
Scheduler::Attach |
CurrentScheduler::Detach |
Scheduler::Reference |
Scheduler::Release |
调用不适当的释放或分离方法会在运行时产生未指定的行为。
当使用导致运行时为您创建默认计划程序的功能(如 PPL)时,不要释放或分离此计划程序。 运行时管理它创建的任何计划程序的生存期。
因为运行时不会损坏Scheduler对象之前完成所有任务后,您可以使用 concurrency::Scheduler::RegisterShutdownEvent 方法或 concurrency::CurrentScheduler::RegisterShutdownEvent 方法来接收通知时Scheduler对象被销毁。 当您必须等待 Scheduler 对象所计划的每个任务完成时,这非常有用。
Top
方法和功能
本节概述了 CurrentScheduler 和 Scheduler 类的重要方法。
将 CurrentScheduler 类视为一个帮助器,该帮助器用于创建在当前上下文中使用的计划程序。 通过 Scheduler 类,可以控制属于另一个上下文的计划程序。
下表显示了 CurrentScheduler 类所定义的重要方法。
方法 |
说明 |
---|---|
创建一个使用指定策略的 Scheduler 对象,并将其与当前上下文相关联。 |
|
检索指向与当前上下文关联的 Scheduler 对象的指针。 此方法不递增 Scheduler 对象的引用计数。 |
|
从当前上下文分离当前计划程序,并将上一个计划程序设置为当前计划程序。 |
|
注册销毁当前计划程序时运行时设置的事件。 |
|
创建 concurrency::ScheduleGroup 的当前计划程序中的对象。 |
|
向当前计划程序的计划队列添加一个轻量级任务。 |
|
检索与当前计划程序关联的策略的副本。 |
下表显示了 Scheduler 类所定义的重要方法。
方法 |
说明 |
---|---|
创建使用指定策略的 Scheduler 对象。 |
|
将 Scheduler 对象与当前上下文相关联。 |
|
递增 Scheduler 对象的引用计数器。 |
|
递减 Scheduler 对象的引用计数器。 |
|
注册销毁 Scheduler 对象时运行时设置的事件。 |
|
创建 concurrency::ScheduleGroup 对象中Scheduler对象。 |
|
通过 Scheduler 对象计划轻量级任务。 |
|
检索与 Scheduler 对象关联的策略的副本。 |
|
设置当运行时创建默认计划程序时要使用的策略。 |
|
将默认策略还原为在调用 SetDefaultSchedulerPolicy 之前处于活动状态的策略。 如果默认计划程序是在此调用后创建的,运行时将使用默认策略设置来创建该计划程序。 |
Top
示例
有关如何创建和管理计划程序实例的基本示例,请参见如何:管理计划程序实例。