Planerinstanzen
In diesem Dokument werden die Rolle von Planerinstanzen in der Concurrency Runtime sowie die Verwendung der Klassen concurrency::Scheduler und concurrency::CurrentScheduler verwendet, um zu Planerinstanzen erstellen und zu verwalten. Planerinstanzen sind nützlich, wenn Sie bestimmten Arten von Arbeitslasten explizite Planungsrichtlinien zuordnen möchten. Beispielsweise können Sie eine Planerinstanz erstellen, um einige Aufgaben mit höherer Threadpriorität auszuführen und andere Aufgaben mit dem Standardplaner mit normaler Threadpriorität auszuführen.
Tipp
Die Concurrency Runtime stellt einen Standardplaner bereit. Es ist daher nicht erforderlich, einen Planer in der Anwendung zu erstellen.Der Taskplaner ermöglicht eine genauere Steuerung der Leistung von Anwendungen. Aus diesem Grund wird empfohlen, mit der Parallel Patterns Library (PPL) oder der Asynchronous Agents Library zu beginnen, wenn Sie noch nicht mit der Concurrency Runtime vertraut sind.
Abschnitte
Die Scheduler-Klasse und die CurrentScheduler-Klasse
Erstellen einer Planerinstanz
Verwalten der Lebensdauer einer Planerinstanz
Methoden und Funktionen
Beispiel
Die Scheduler-Klasse und die CurrentScheduler-Klasse
Der Taskplaner ermöglicht Anwendungen die Arbeitsplanung mittels einer oder mehrerer Planerinstanzen. Die concurrency::Scheduler-Klasse stellt eine Planerinstanz dar und kapselt die Funktionalität, die im Zusammenhang mit Aufgaben verknüpft wird.
Der an einen Planer angefügte Thread wird als Ausführungskontext oder einfach als Kontext bezeichnet. Ein Planer kann zu jedem beliebigen Zeitpunkt im aktuellen Kontext aktiv sein. Der aktive Planer wird auch als aktueller Planer bezeichnet. Die Concurrency Runtime verwendet die concurrency::CurrentScheduler-Klasse, um Zugriff auf den aktuellen Planer über. Der aktuelle Planer für einen Kontext kann sich vom aktuellen Planer für einen anderen Kontext unterscheiden. Von der Runtime wird keine Darstellung des aktuellen Planers auf Prozessebene bereitgestellt.
In der Regel wird die CurrentScheduler-Klasse für den Zugriff auf den aktuellen Planer verwendet. Die Scheduler-Klasse ist hilfreich, wenn Sie einen anderen Planer als den aktuellen verwalten müssen.
In den folgenden Abschnitten erfahren Sie, wie Sie eine Planerinstanz erstellen und verwalten. Ein vollständiges Beispiel zur Veranschaulichung dieser Aufgaben finden Sie unter Gewusst wie: Verwalten einer Planerinstanz.
[Nach oben]
Erstellen einer Planerinstanz
Es gibt drei Möglichkeiten, ein Scheduler-Objekt zu erstellen:
Wenn kein Planer vorhanden ist, erstellt die Runtime automatisch einen Standardplaner, wenn Sie Laufzeitfunktionen, wie z. B. einen parallelen Algorithmus, zur Ausführung von Arbeiten verwenden. Der Standardplaner wird als aktueller Planer für den Kontext festgelegt, mit dem die parallele Verarbeitung initiiert wird.
Die concurrency::CurrentScheduler::Create-Methode erstellt ein Scheduler-Objekt, das eine bestimmte Richtlinie und weist dieses Objekt bzw. diesen Planer dem aktuellen Kontext zu.
Die concurrency::Scheduler::Create-Methode erstellt ein Scheduler-Objekt, das eine bestimmte Richtlinie verwendet, weist dieses aber nicht dem aktuellen Kontext zu.
Bei der Erstellung eines Standardplaners durch die Runtime können alle gleichzeitig ausgeführten Aufgaben denselben Planer nutzen. In der Regel wird die von der Parallel Patterns Library (PPL) oder von der Asynchronous Agents Library bereitgestellte Funktionalität zur Ausführung paralleler Arbeitsschritte verwendet. Somit müssen Sie die Richtlinie und die Lebensdauer des Planers nicht direkt steuern. Bei Nutzung der PPL oder der Agents Library erstellt die Runtime den Standardplaner, falls kein Planer vorhanden ist, und legt diesen als aktuellen Planer für jeden Kontext fest. Wenn Sie einen Planer erstellen und als aktuellen Planer festlegen, verwendet die Laufzeit diesen Planer, um Aufgaben zu planen. Erstellen Sie zusätzliche Planerinstanzen nur, wenn Sie eine bestimmte Planungsrichtlinie benötigen. Weitere Informationen zu Richtlinien, die einem Planer zugeordnet sind, finden Sie Planerrichtlinien.
[Nach oben]
Verwalten der Lebensdauer einer Planerinstanz
Die Runtime steuert die Lebensdauer von Scheduler-Objekten mithilfe eines Mechanismus zum Zählen von Verweisen.
Wenn Sie die CurrentScheduler::Create-Methode oder die Scheduler::Create-Methode zur Erstellung eines Scheduler-Objekts verwenden, setzt die Runtime den Verweiszähler dieses Planers auf 1. Der Wert des Verweiszählers wird erhöht, wenn Sie die concurrency::Scheduler::Attach-Methode aufrufen. Die Scheduler::Attach-Methode ordnet das Scheduler-Objekt dem aktuellen Kontext zu. Dadurch wird das Objekt als aktueller Planer festgelegt. Wenn Sie die CurrentScheduler::Create-Methode aufrufen, erstellt die Runtime ein Scheduler-Objekt und weist dieses dem aktuellen Kontext zu (und setzt den Verweiszähler auf 1). Sie können die Methode auch concurrency::Scheduler::Reference verwenden, um den Verweiszähler Scheduler eines Objekts zu erhöhen.
Der Wert des Verweiszählers, wenn Sie die Methode concurrency::CurrentScheduler::Detach aufrufen, um den aktuellen Planer abzutrennen, oder ruft die Methode concurrency::Scheduler::Release auf. Wenn der Verweiszähler 0 (null) erreicht, zerstört die Runtime das Scheduler-Objekt, nachdem alle geplanten Aufgaben beendet wurden. Eine ausgeführte Aufgabe kann den Verweiszählerwert des aktuellen Planers erhöhen. Wenn also der Verweiszähler 0 (null) erreicht und eine Aufgabe den Zählerwert erhöht, wird das Scheduler-Objekt nicht zerstört, bis der Verweiszähler erneut 0 (null) erreicht und alle Aufgaben beendet sind.
Die Runtime behält für jeden Kontext einen internen Stapel von Scheduler-Objekten bei. Wenn Sie die Scheduler::Attach-Methode oder die CurrentScheduler::Create-Methode aufrufen, wird das Scheduler-Objekt auf dem Stapel für den aktuellen Kontext abgelegt (Push-Verfahren). Dadurch wird das Objekt als aktueller Planer festgelegt. Wenn Sie CurrentScheduler::Detach aufrufen, wird der aktuelle Planer vom Stapel für den aktuellen Kontext aufgenommen (Pop-Verfahren) und das vorherige Objekt als aktueller Planer festgelegt.
Die Runtime bietet mehrere Möglichkeiten zur Verwaltung der Lebensdauer einer Planerinstanz. Die folgende Tabelle enthält die jeweils entsprechende Methode zum Freigeben bzw. Trennen des Planers vom aktuellen Kontext für die Methoden zum Erstellen bzw. Zuweisen eines Planers zum aktuellen Kontext.
Methode zum Erstellen bzw. Zuweisen |
Methode zum Freigeben bzw. Trennen |
---|---|
CurrentScheduler::Create |
CurrentScheduler::Detach |
Scheduler::Create |
Scheduler::Release |
Scheduler::Attach |
CurrentScheduler::Detach |
Scheduler::Reference |
Scheduler::Release |
Das Aufrufen einer nicht geeigneten release- oder detach-Methode verursacht nicht definiertes Verhalten zur Laufzeit.
Wenn Sie Funktionen verwenden, die bewirken, dass zur Laufzeit automatisch ein Standardplaner erstellt wird, wie z. B. die PPL, müssen Sie diesen Planer nicht manuell freigeben/trennen. Die Lebensdauer automatisch erstellter Planer wird von der Runtime verwaltet.
Da die Runtime ein Scheduler-Objekt zerstört, wenn alle Aufgaben beendet haben, können Sie die Methode concurrency::Scheduler::RegisterShutdownEvent oder die concurrency::CurrentScheduler::RegisterShutdownEvent-Methode verwenden, um eine Benachrichtigung zu empfangen, wenn ein Scheduler-Objekt zerstört wird. Dies ist nützlich, wenn Sie auf das Beenden der einzelnen von einem Scheduler-Objekt geplanten Aufgaben warten müssen.
[Nach oben]
Methoden und Funktionen
In diesem Abschnitt sind alle wichtigen Methoden der CurrentScheduler-Klasse und der Scheduler-Klasse zusammengefasst.
Betrachten Sie die CurrentScheduler-Klasse als Hilfsklasse zur Erstellung eines Planers für den aktuellen Kontext. Mit der Scheduler-Klasse können Sie einen Planer steuern, der einem anderen Kontext zugewiesen ist.
Die folgende Tabelle enthält alle wichtigen von der CurrentScheduler-Klasse definierten Methoden.
Methode |
Beschreibung |
---|---|
Erstellt ein Scheduler-Objekt, das die angegebene Richtlinie verwendet, und weist dieses dem aktuellen Kontext zu. |
|
Ruft einen Zeiger auf das Scheduler-Objekt ab, das dem aktuellen Kontext zugewiesen ist. Diese Methode erhöht den Verweiszählerwert des Scheduler-Objekts nicht. |
|
Trennt den aktuellen Planer vom aktuellen Kontext und legt den vorherigen Planer als aktuellen Planer fest. |
|
Registriert ein Ereignis, das von der Runtime festgelegt wird, wenn der aktuelle Planer zerstört wird. |
|
Erstellt ein concurrency::ScheduleGroup-Objekt im aktuellen Planer. |
|
Fügt der Warteschlange des aktuellen Planers eine einfache Aufgabe hinzu. |
|
Ruft eine Kopie der Richtlinie ab, die dem aktuellen Planer zugeordnet ist. |
Die folgende Tabelle enthält alle wichtigen von der Scheduler-Klasse definierten Methoden.
Methode |
Beschreibung |
---|---|
Erstellt ein Scheduler-Objekt, das die angegebene Richtlinie verwendet. |
|
Ordnet das Scheduler-Objekt dem aktuellen Kontext zu. |
|
Erhöht den Verweiszählerwert des Scheduler-Objekts. |
|
Verringert den Verweiszählerwert des Scheduler-Objekts. |
|
Registriert ein Ereignis, das von der Runtime festgelegt wird, wenn das Scheduler-Objekt zerstört wird. |
|
Erstellt ein concurrency::ScheduleGroup-Objekt im Scheduler-Objekt. |
|
Plant eine einfache Aufgabe im Scheduler-Objekt. |
|
Ruft eine Kopie der Richtlinie ab, die dem Scheduler-Objekt zugeordnet ist. |
|
Legt die Richtlinie fest, die beim Erstellen des Standardplaners von der Runtime verwendet wird. |
|
Stellt die Richtlinie, die vor dem Aufruf von SetDefaultSchedulerPolicy aktiviert war, als Standardrichtlinie wieder her. Wenn der Standardplaner nach diesem Aufruf erstellt wird, verwendet die Runtime die Standardrichtlinieneinstellungen beim Erstellen des Planers. |
[Nach oben]
Beispiel
Zwei grundlegende Beispiele zum Erstellen und Verwalten einer Planerinstanz finden Sie unter Gewusst wie: Verwalten einer Planerinstanz.
Siehe auch
Aufgaben
Gewusst wie: Verwalten einer Planerinstanz