排程器執行個體
本檔說明並行執行時間中的排程器實例角色,以及如何使用 並行::排程器和 並行::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::Attach
Scheduler
物件與目前內容產生關聯。 這使得它成為目前的排程器。 當您呼叫 CurrentScheduler::Create
方法時,執行時間都會建立 Scheduler
物件,並將它附加至目前的內容(並將參考計數設定為一個)。 您也可以使用 並行::Scheduler::Reference 方法來遞增物件的參考計數 Scheduler
。
當您呼叫 concurrency::CurrentScheduler::D etach 方法來中斷目前排程器,或呼叫 concurrency::Scheduler::Release 方法時,執行時間會遞減參考計數。 當參考計數達到零時,執行時間會在所有排程的工作完成之後終結 Scheduler
物件。 允許執行中的工作遞增目前排程器的參考計數。 因此,如果參考計數達到零,而工作會遞增參考計數,則執行時間不會終結 Scheduler
物件,直到參考計數再次達到零且所有工作完成為止。
執行時間會針對每個內容維護物件的內部堆疊 Scheduler
。 當您呼叫 Scheduler::Attach
或 CurrentScheduler::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 之前作用中的原則。 如果在呼叫之後建立預設排程器,執行時間會使用預設原則設定來建立排程器。 |
[靠上]
範例
如需如何建立和管理排程器實例的基本範例,請參閱 如何:管理排程器實例 。