Share via


Kontexte

In diesem Dokument wird die Rolle von Kontexten in der Parallelitätslaufzeit beschrieben. Ein Thread, der an einen Scheduler angefügt ist, wird als Ausführungskontext oder einfach nur als Kontext bezeichnet. Mit der Parallelitätsfunktion::wait und der Parallelitätsklasse::Context können Sie das Verhalten von Kontexten steuern. Verwenden Sie die wait Funktion, um den aktuellen Kontext für eine bestimmte Zeit anzusetzen. Verwenden Sie die Context Klasse, wenn Sie mehr Kontrolle darüber benötigen, wann Kontexte blockieren, entsperren und ertragen oder wenn Sie den aktuellen Kontext überschreiben möchten.

Tipp

Die Concurrency Runtime stellt einen Standardplaner bereit. Sie müssen daher keinen in Ihrer Anwendung erstellen. Da der Aufgabenplaner Ihnen dabei hilft, die Leistung Ihrer Anwendungen zu optimieren, empfehlen wir, mit der Parallel Patterns Library (PPL) oder der asynchronen Agents-Bibliothek zu beginnen, wenn Sie mit der Parallelitätslaufzeit noch nicht vertraut sind.

Die Wait-Funktion

Die Parallelität::Wait-Funktion liefert kooperativ die Ausführung des aktuellen Kontexts für eine angegebene Anzahl von Millisekunden. Die Laufzeit verwendet die Ertragszeit, um andere Aufgaben auszuführen. Nachdem die angegebene Zeit abgelaufen ist, plant die Laufzeit den Kontext für die Ausführung neu. Daher kann die wait Funktion den aktuellen Kontext länger als der für den milliseconds Parameter angegebene Wert anhalten.

Durch das Übergeben von 0 (Null) für den milliseconds Parameter wird die Laufzeit angehalten, bis alle anderen aktiven Kontexte die Möglichkeit erhalten, Arbeit auszuführen. Auf diese Weise können Sie einen Vorgang allen anderen aktiven Vorgängen zuweisen.

Beispiel

Ein Beispiel, in dem die wait Funktion verwendet wird, um den aktuellen Kontext zurückzugeben, und somit die Ausführung anderer Kontexte ermöglichen, finden Sie unter How to: Use Schedule Groups to Influence Order of Execution.

Die Context-Klasse

Die Parallelität::Context-Klasse bietet eine Programmierstraktion für einen Ausführungskontext und bietet zwei wichtige Features: die Möglichkeit, den aktuellen Kontext kooperativ zu blockieren, zu entsperren und den aktuellen Kontext zu überschreiben.

Kooperativ blockieren

Mit der Context-Klasse können Sie den aktuellen Ausführungskontext blockieren oder zurückhalten. Das Blockieren oder Zurückgeben ist nützlich, wenn der aktuelle Kontext nicht fortgesetzt werden kann, da eine Ressource nicht verfügbar ist.

Die Parallelität::Context::Block-Methode blockiert den aktuellen Kontext. Ein blockierter Kontext liefert seine Verarbeitungsressourcen, sodass die Laufzeit andere Aufgaben ausführen kann. Die Parallelität::Context::Unblock-Methode entsperrt einen blockierten Kontext. Die Context::Unblock Methode muss aus einem anderen Kontext als dem aufgerufenen Context::Blockaufgerufen werden. Die Laufzeit löst Parallelität::context_self_unblock aus, wenn ein Kontext versucht, die Blockierung selbst aufzuheben.

Um einen Kontext kooperativ zu blockieren und aufzuheben, rufen Sie in der Regel Parallelität::Context::CurrentContext auf, um einen Zeiger auf das Context Objekt abzurufen, das dem aktuellen Thread zugeordnet ist, und das Ergebnis zu speichern. Anschließend rufen Sie die Context::Block Methode auf, um den aktuellen Kontext zu blockieren. Rufen Sie Context::Unblock später einen separaten Kontext auf, um die Blockierung des blockierten Kontexts aufzuheben.

Sie müssen mit jedem Paar von Anrufen übereinstimmen, an Context::Block und Context::Unblock. Die Laufzeit löst Parallelität::context_unblock_unbalanced aus, wenn die Context::Block Oder-Methode Context::Unblock fortlaufend ohne übereinstimmenden Aufruf der anderen Methode aufgerufen wird. Sie müssen jedoch nicht vor dem Anruf Context::UnblockanrufenContext::Block. Wenn beispielsweise ein Kontext vor einem anderen Kontext aufruft Context::UnblockContext::Block, wird dieser Kontext erneut blockiert Standard.

Die Parallelität::Context::Yield-Methode führt zur Ausführung, sodass die Laufzeit andere Aufgaben ausführen und dann den Kontext für die Ausführung neu planen kann. Wenn Sie die Context::Block Methode aufrufen, plant die Laufzeit den Kontext nicht neu.

Beispiel

Ein Beispiel zur Implementierung einer kooperativen Semaphorklasse finden Context::BlockContext::UnblockContext::Yield Sie unter How to: Use the Context Class to Implement a Cooperative Semaphor.

Überzeichnung

Der Standardzeitplaner erstellt dieselbe Anzahl von Threads wie verfügbare Hardwarethreads. Sie können die Überschreibung verwenden, um zusätzliche Threads für einen bestimmten Hardwarethread zu erstellen.

Bei rechenintensiven Vorgängen wird die Überschreibung in der Regel nicht skaliert, da dadurch zusätzlicher Aufwand eingeführt wird. Bei Aufgaben, die eine hohe Latenz aufweisen, z. B. das Lesen von Daten vom Datenträger oder von einer Netzwerkverbindung, kann die Überschreibung der Gesamteffizienz einiger Anwendungen verbessert werden.

Hinweis

Aktivieren Sie oversubscription nur über einen Thread, der von der Concurrency Runtime erstellt wurde. Oversubscription hat keine Auswirkung, wenn sie von einem Thread aufgerufen wird, der nicht von der Laufzeit erstellt wurde (einschließlich des Standard Threads).

Um die Überschreibung im aktuellen Kontext zu aktivieren, rufen Sie die Parallelität::Context::Oversubscribe-Methode auf, wobei der _BeginOversubscription Parameter auf . true festgelegt ist. Wenn Sie die Überschreibung für einen Thread aktivieren, der von der Concurrency Runtime erstellt wurde, wird die Laufzeit einen zusätzlichen Thread erstellen. Nachdem alle Vorgänge, für die eine Überschreibung erforderlich ist, beendet wurden, rufen Sie Context::Oversubscribe den _BeginOversubscription Parameter auf false.

Sie können oversubscription mehrmals aus dem aktuellen Kontext aktivieren, aber Sie müssen sie genauso oft deaktivieren, wie sie aktiviert werden. Überschreibung kann auch geschachtelt werden; d. h. eine Aufgabe, die von einer anderen Aufgabe erstellt wird, die übersubscription verwendet, kann auch den Kontext überschreiben. Wenn jedoch sowohl eine geschachtelte Aufgabe als auch das übergeordnete Element zum gleichen Kontext gehören, bewirkt nur der äußerste Aufruf Context::Oversubscribe die Erstellung eines zusätzlichen Threads.

Hinweis

Die Laufzeit löst Parallelität::invalid_oversubscribe_operation aus, wenn die Überschreibung deaktiviert ist, bevor sie aktiviert wird.

Beispiel

Ein Beispiel, bei dem die Überschreibung verwendet wird, um die Latenz zu verrechnen, die durch das Lesen von Daten aus einer Netzwerkverbindung verursacht wird, finden Sie unter How to: Use Oversubscription to Offset Latency.

Siehe auch

Aufgabenplanung
Vorgehensweise: Beeinflussen der Ausführungsreihenfolge mithilfe von Zeitplangruppen
Vorgehensweise: Implementieren einer kooperativen Semaphore mithilfe der Context-Klasse
Vorgehensweise: Verwenden der Überzeichnung zum Versetzen der Latenz