Planerinstanzen

In diesem Dokument werden die Rolle von Planerinstanzen in der Concurrency Runtime sowie die Verwendung der Concurrency::Scheduler- und der Concurrency::CurrentScheduler-Klasse zum Erstellen und Verwalten von Planerinstanzen veranschaulicht. 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 im Zusammenhang mit der Aufgabenplanung.

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 ermöglicht den Zugriff auf den aktuellen Planer über die Concurrency::CurrentScheduler-Klasse. 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 verwendet, 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). Mit der Concurrency::Scheduler::Reference-Methode können Sie den Verweiszählerwert eines Scheduler-Objekts erhöhen.

Der Wert des Verweiszählers wird verringert, wenn Sie die Concurrency::CurrentScheduler::Detach-Methode zur Trennung des aktuellen Planers oder die Concurrency::Scheduler::Release-Methode aufrufen. 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 erst zerstört, wenn alle Aufgaben beendet wurden, können Sie die Concurrency::Scheduler::RegisterShutdownEvent-Methode oder mit der Concurrency::CurrentScheduler::RegisterShutdownEvent-Methode verwenden, um sich eine Benachrichtigung senden zu lassen, wenn ein Scheduler-Objekts 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

Create

Erstellt ein Scheduler-Objekt, das die angegebene Richtlinie verwendet, und weist dieses dem aktuellen Kontext zu.

Get

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.

Detach

Trennt den aktuellen Planer vom aktuellen Kontext und legt den vorherigen Planer als aktuellen Planer fest.

RegisterShutdownEvent

Registriert ein Ereignis, das von der Runtime festgelegt wird, wenn der aktuelle Planer zerstört wird.

CreateScheduleGroup

Erstellt ein Concurrency::ScheduleGroup-Objekt im aktuellen Planer.

ScheduleTask

Fügt der Warteschlange des aktuellen Planers eine einfache Aufgabe hinzu.

GetPolicy

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

Create

Erstellt ein Scheduler-Objekt, das die angegebene Richtlinie verwendet.

Attach

Ordnet das Scheduler-Objekt dem aktuellen Kontext zu.

Reference

Erhöht den Verweiszählerwert des Scheduler-Objekts.

Release

Verringert den Verweiszählerwert des Scheduler-Objekts.

RegisterShutdownEvent

Registriert ein Ereignis, das von der Runtime festgelegt wird, wenn das Scheduler-Objekt zerstört wird.

CreateScheduleGroup

Erstellt ein Concurrency::ScheduleGroup-Objekt im Scheduler-Objekt.

ScheduleTask

Plant eine einfache Aufgabe im Scheduler-Objekt.

GetPolicy

Ruft eine Kopie der Richtlinie ab, die dem Scheduler-Objekt zugeordnet ist.

SetDefaultSchedulerPolicy

Legt die Richtlinie fest, die beim Erstellen des Standardplaners von der Runtime verwendet wird.

ResetDefaultSchedulerPolicy

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

Konzepte

Taskplaner (Concurrency Runtime)

Weitere Ressourcen

Gewusst wie: Verwalten einer Planerinstanz

Planerrichtlinien

Planungsgruppen

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

Juli 2010

Inhalt neu strukturiert.

Informationsergänzung.