分享方式:


排程器執行個體

本檔說明並行執行時間中的排程器實例角色,以及如何使用 並行::排程器和 並行::CurrentScheduler 類別來建立和管理排程器實例。 當您想要將明確排程原則與特定類型的工作負載產生關聯時,排程器實例很有用。 例如,您可以建立一個排程器執行個體,在高權限的執行緒優先順序上執行一些工作,並使用預設排程器在正常的執行緒優先順序上執行其他工作。

提示

並行執行階段會提供預設排程器,因此您不需要在應用程式中建立排程器。 由於工作排程器可協助您微調應用程式的效能,因此如果您不熟悉並行執行時間,建議您從平行模式程式庫 (PPL) 非同步代理程式程式庫 開始 。

區段

排程器和 CurrentScheduler 類別

工作排程器可讓應用程式使用一或多個 排程器實例 來排程工作。 concurrency ::Scheduler 類別代表排程器實例,並封裝與排程工作相關的功能。

附加至排程器的執行緒稱為 執行內容 ,或只是 內容 。 一個排程器可以隨時在目前內容上作用中。 使用中的排程器也稱為 目前排程器 。 並行執行時間會使用 並行::CurrentScheduler 類別來提供目前排程器的存取權。 某個內容的目前排程器可能會與另一個內容的目前排程器不同。 執行時間不提供目前排程器的進程層級標記法。

一般而言,類別 CurrentScheduler 是用來存取目前的排程器。 當您需要管理不是目前排程器的排程器時,類別 Scheduler 很有用。

下列各節說明如何建立和管理排程器實例。 如需說明這些工作的完整範例,請參閱 如何:管理排程器實例

[靠上]

建立排程器實例

有三種方式可以建立 Scheduler 物件:

  • 如果沒有排程器,執行時間會在您使用執行時間功能,例如平行演算法來執行工作時,為您建立預設排程器。 預設排程器會成為起始平行工作之內容的目前排程器。

  • concurrency ::CurrentScheduler::Create 方法會 Scheduler 建立物件,該物件會使用特定原則,並將該排程器與目前內容產生關聯。

  • concurrency ::Scheduler::Create 方法會 Scheduler 建立使用特定原則的物件,但不會將它與目前內容產生關聯。

允許執行時間建立預設排程器,可讓所有並行工作共用相同的排程器。 一般而言,平行模式程式庫 (PPL) 或 非同步代理程式程式庫 所提供的 功能是用來執行平行工作。 因此,您不需要直接使用排程器來控制其原則或存留期。 當您使用 PPL 或代理程式程式庫時,執行時間會在不存在時建立預設排程器,並使它成為每個內容的目前排程器。 當您建立排程器並將它設定為目前的排程器時,執行時間會使用該排程器來排程工作。 只有在您需要特定排程原則時,才建立其他排程器實例。 如需與排程器相關聯之原則的詳細資訊,請參閱 排程器原則

[靠上]

管理排程器實例的存留期

執行時間會使用參考計數機制來控制物件的存留期 Scheduler

當您使用 CurrentScheduler::Create 方法或 Scheduler::Create 方法來建立 Scheduler 物件時,執行時間會將該排程器的初始參考計數設定為一個。 當您呼叫 concurrency::Scheduler::Attach 方法時,執行時間會遞增參考計數。 方法會將 Scheduler::AttachScheduler 物件與目前內容產生關聯。 這使得它成為目前的排程器。 當您呼叫 CurrentScheduler::Create 方法時,執行時間都會建立 Scheduler 物件,並將它附加至目前的內容(並將參考計數設定為一個)。 您也可以使用 並行::Scheduler::Reference 方法來遞增物件的參考計數 Scheduler

當您呼叫 concurrency::CurrentScheduler::D etach 方法來中斷目前排程器,或呼叫 concurrency::Scheduler::Release 方法時,執行時間會遞減參考計數。 當參考計數達到零時,執行時間會在所有排程的工作完成之後終結 Scheduler 物件。 允許執行中的工作遞增目前排程器的參考計數。 因此,如果參考計數達到零,而工作會遞增參考計數,則執行時間不會終結 Scheduler 物件,直到參考計數再次達到零且所有工作完成為止。

執行時間會針對每個內容維護物件的內部堆疊 Scheduler 。 當您呼叫 Scheduler::AttachCurrentScheduler::Create 方法時,執行時間會將該 Scheduler 物件推送至目前內容的堆疊。 這使得它成為目前的排程器。 當您呼叫 CurrentScheduler::Detach 時,執行時間會從堆疊中擷取目前內容目前的排程器,並將前一個排程器設定為目前的排程器。

執行時間提供數種方式來管理排程器實例的存留期。 下表顯示適當的方法,會針對每個建立或附加排程器至目前內容的方法,從目前的內容釋放或中斷連結排程器。

建立或附加方法 Release 或 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 的每個工作完成時,這會很有用。

[靠上]

方法和功能

本節摘要說明 和 Scheduler 類別的重要方法 CurrentScheduler

請將 類別 CurrentScheduler 視為協助程式,以建立排程器以供目前內容使用。 類別 Scheduler 可讓您控制屬於另一個內容的排程器。

下表顯示 類別所 CurrentScheduler 定義的重要方法。

方法 描述
建立 Scheduler建立物件,該物件會使用指定的原則,並將它與目前的內容產生關聯。
Get 擷取與目前內容相關聯的 物件指標 Scheduler 。 這個方法不會遞增 物件的參考計數 Scheduler
卸離 將目前的排程器與目前內容中斷連結,並將前一個排程器設定為目前的排程器。
RegisterShutdownEvent 註冊執行時間在終結目前排程器時所設定的事件。
CreateScheduleGroup 在目前的排程器中建立 並行::ScheduleGroup 物件。
ScheduleTask 將輕量型工作新增至目前排程器的排程佇列。
GetPolicy 擷取與目前排程器相關聯的原則複本。

下表顯示 類別所 Scheduler 定義的重要方法。

方法 描述
建立 Scheduler建立使用指定原則的 物件。
附加 Scheduler 物件與目前內容產生關聯。
參考 遞增 物件的參考計數器 Scheduler
版本 遞減 物件的參考計數器 Scheduler
RegisterShutdownEvent 註冊執行時間在終結物件時 Scheduler 所設定的事件。
CreateScheduleGroup 在 物件中 Scheduler 建立 並行::ScheduleGroup 物件。
ScheduleTask 從 物件排程輕量型工作 Scheduler
GetPolicy 擷取與 Scheduler 物件相關聯的原則複本。
SetDefaultSchedulerPolicy 設定執行時間在建立預設排程器時要使用的原則。
ResetDefaultSchedulerPolicy 將預設原則還原至呼叫 SetDefaultSchedulerPolicy 之前作用中的原則。 如果在呼叫之後建立預設排程器,執行時間會使用預設原則設定來建立排程器。

[靠上]

範例

如需如何建立和管理排程器實例的基本範例,請參閱 如何:管理排程器實例

另請參閱

工作排程器
如何:管理排程器執行個體
排程器原則
排程群組