Freigeben über


Context-Klasse

Stellt eine Abstraktion für einen Ausführungskontext dar.

Syntax

class Context;

Mitglieder

Geschützte Konstruktoren

Name Beschreibung
~Context Destructor

Öffentliche Methoden

Name Beschreibung
Blockieren Blockiert den aktuellen Kontext.
CurrentContext Gibt einen Zeiger auf den aktuellen Kontext zurück.
GetId Gibt einen Bezeichner für den Kontext zurück, der innerhalb des Planers eindeutig ist, zu dem der Kontext gehört.
GetScheduleGroupId Gibt einen Bezeichner für die Planungsgruppe zurück, an der der Kontext gerade arbeitet.
GetVirtualProcessorId Gibt einen Bezeichner für den virtuellen Prozessor zurück, auf dem der Kontext gerade ausgeführt wird.
Id Gibt einen Bezeichner für den aktuellen Kontext zurück, der innerhalb des Planers, dem der aktuelle Kontext zugehörig ist, eindeutig ist.
WirdAktuelleAufgabenSammlungAbgebrochen Gibt an, ob die Aufgabensammlung, die gerade inline für den aktuellen Kontext ausgeführt wird, sich mitten in einem aktiven Abbruch befindet (oder sich bald darin befinden wird).
IsSynchronouslyBlocked Bestimmt, ob der Kontext synchron blockiert wird oder nicht. Ein Kontext wird als synchron blockiert angesehen, wenn er explizit eine zu einer Blockierung führende Aktion ausgeführt hat.
Überbuchen Fügt einem Scheduler für die Dauer eines Codeblocks einen zusätzlichen virtuellen Prozessor hinzu, wenn es in einem Kontext aufgerufen wird, der auf einem der virtuellen Prozessoren dieses Schedulers ausgeführt wird.
ScheduleGroupId Gibt einen Bezeichner für die Zeitplangruppe zurück, an der der aktuelle Kontext arbeitet.
Entblocken Hebt die Blockierung des Kontexts auf und bewirkt, dass er ausführbar wird.
VirtualProcessorId Gibt einen Bezeichner für den virtuellen Prozessor zurück, auf dem der aktuelle Kontext ausgeführt wird.
Yield Gibt die Ausführung frei, damit ein anderer Kontext ausgeführt werden kann. Wenn kein anderer Kontext verfügbar ist, an den gewechselt werden kann, kann der Planer zu einem anderen Betriebssystem-Thread wechseln.

Hinweise

Der Parallelitätslaufzeit-Planer (siehe Scheduler) verwendet Ausführungskontexte, um die Arbeit, die von Ihrer Anwendung in die Warteschlange gestellt wurde, auszuführen. Ein Win32-Thread ist ein Beispiel für einen Ausführungskontext auf einem Windows-Betriebssystem.

Der Nebenläufigkeitsgrad eines Planers ist zu jeder Zeit gleich der Anzahl virtueller Prozessoren, die ihm vom Ressourcen-Manager gewährt wird. Ein virtueller Prozessor ist eine Abstraktion für eine Verarbeitungsressource und wird einem Hardwarethread des zugrunde liegenden Systems zugeordnet. Nur ein einzelner Planerkontext kann jeweils auf einem virtuellen Prozessor ausgeführt werden.

Der Planer ist grundsätzlich kooperativ, und ein Ausführungskontext kann seinen virtuellen Prozessor jederzeit für einen anderen Kontext freigeben, wenn er in einen Wartezustand wechseln möchte. Wenn die Wartebedingung erfüllt ist, kann keine Fortsetzung erfolgen, bis ein verfügbarer virtueller Prozessor vom Scheduler mit der Ausführung beginnt.

Vererbungshierarchie

Context

Anforderungen

Kopfzeile: concrt.h

Namespace: Parallelität

Blockieren

Blockiert den aktuellen Kontext.

static void __cdecl Block();

Hinweise

Diese Methode führt dazu, dass der Standardplaner des Prozesses erstellt und/oder an den aufrufenden Kontext angefügt wird, wenn derzeit dem aufrufenden Kontext kein Planer zugeordnet ist.

Wenn der aufrufende Kontext auf einem virtuellen Prozessor ausgeführt wird, findet der virtuelle Prozessor einen anderen ausgeführten Kontext, der ausgeführt werden kann, oder kann potenziell einen neuen erstellen.

Nachdem die Block Methode aufgerufen wurde oder aufgerufen wird, müssen Sie sie mit einem Aufruf der Unblock-Methode aus einem anderen Ausführungskontext koppeln, damit sie erneut ausgeführt werden kann. Beachten Sie, dass es einen kritischen Zeitraum zwischen dem Punkt gibt, an dem Ihr Code seinen Kontext für einen anderen Thread veröffentlicht, um die Unblock Methode und den Punkt, an dem der tatsächliche Methodenaufruf Block erfolgt, aufrufen zu können. Während dieses Zeitraums dürfen Sie keine Methode aufrufen, die ihrerseits aus spezifischen Gründen blockieren und freigeben kann (z. B. das Erwerben einer Sperre). Aufrufe an die Block und Unblock Methoden verfolgen nicht den Grund für das Blockieren und Aufheben der Blockierung. Nur ein Objekt sollte über den Besitz eines Block- Unblock Paars verfügen.

Diese Methode kann eine Vielzahl von Ausnahmen auslösen, einschließlich scheduler_resource_allocation_error.

~Zusammenhang

virtual ~Context();

CurrentContext

Gibt einen Zeiger auf den aktuellen Kontext zurück.

static Context* __cdecl CurrentContext();

Rückgabewert

Ein Zeiger auf den aktuellen Kontext.

Hinweise

Diese Methode führt dazu, dass der Standardplaner des Prozesses erstellt und/oder an den aufrufenden Kontext angefügt wird, wenn derzeit dem aufrufenden Kontext kein Planer zugeordnet ist.

GetId

Gibt einen Bezeichner für den Kontext zurück, der innerhalb des Planers eindeutig ist, zu dem der Kontext gehört.

virtual unsigned int GetId() const = 0;

Rückgabewert

Ein Bezeichner für den Kontext, der innerhalb des Schedulers eindeutig ist, zu dem der Kontext gehört.

GetScheduleGroupId

Gibt einen Bezeichner für die Planungsgruppe zurück, an der der Kontext gerade arbeitet.

virtual unsigned int GetScheduleGroupId() const = 0;

Rückgabewert

Ein Bezeichner für die Zeitplangruppe, an der der Kontext derzeit arbeitet.

Hinweise

Der Rückgabewert dieser Methode ist ein sofortiges Sampling der Zeitplangruppe, für die der Kontext ausgeführt wird. Wenn diese Methode in einem anderen Kontext als dem aktuellen Kontext aufgerufen wird, kann der Wert zu dem Zeitpunkt, an dem er zurückgegeben wird, bereits veraltet sein und man kann sich nicht darauf verlassen. In der Regel wird diese Methode nur für Debugging- oder Ablaufverfolgungszwecke verwendet.

GetVirtualProcessorId

Gibt einen Bezeichner für den virtuellen Prozessor zurück, auf dem der Kontext gerade ausgeführt wird.

virtual unsigned int GetVirtualProcessorId() const = 0;

Rückgabewert

Wenn der Kontext derzeit auf einem virtuellen Prozessor ausgeführt wird, gibt es einen Bezeichner für diesen virtuellen Prozessor an. Andernfalls ist der Wert -1.

Hinweise

Der Rückgabewert dieser Methode ist ein sofortiges Sampling des virtuellen Prozessors, für den der Kontext ausgeführt wird. Dieser Wert kann veraltet sein, sobald er zurückgegeben wird, und kann nicht darauf vertraut werden. In der Regel wird diese Methode nur für Debugging- oder Ablaufverfolgungszwecke verwendet.

ID

Gibt einen Bezeichner für den aktuellen Kontext zurück, der innerhalb des Planers, dem der aktuelle Kontext zugehörig ist, eindeutig ist.

static unsigned int __cdecl Id();

Rückgabewert

Wenn der aktuelle Kontext einem Scheduler zugeordnet ist, gibt es einen eindeutigen Bezeichner für diesen Kontext innerhalb des Schedulers; andernfalls hat er den Wert -1.

WirdAktuelleAufgabensammlungAbgebrochen

Gibt an, ob die Aufgabensammlung, die gerade inline für den aktuellen Kontext ausgeführt wird, sich mitten in einem aktiven Abbruch befindet (oder sich bald darin befinden wird).

static bool __cdecl IsCurrentTaskCollectionCanceling();

Rückgabewert

Wenn ein Scheduler mit dem aufrufenden Kontext verknüpft ist und eine Aufgabengruppe eine Aufgabe inline in diesem Kontext ausführt, wird angezeigt, ob sich diese Aufgabengruppe im Prozess eines aktiven Abbruchs befindet (oder sich in Kürze befinden wird), andernfalls der Wert false.

IstSynchronGesperrt

Bestimmt, ob der Kontext synchron blockiert wird oder nicht. Ein Kontext wird als synchron blockiert angesehen, wenn er explizit eine zu einer Blockierung führende Aktion ausgeführt hat.

virtual bool IsSynchronouslyBlocked() const = 0;

Rückgabewert

Gibt an, ob der Kontext synchron blockiert wird.

Hinweise

Ein Kontext wird als synchron blockiert angesehen, wenn er explizit eine zu einer Blockierung führende Aktion ausgeführt hat. Im Threadplaner würde dies einen direkten Aufruf der Context::Block Methode oder eines Synchronisierungsobjekts angeben, das mit der Context::Block Methode erstellt wurde.

Der Rückgabewert dieser Methode ist ein sofortiges Beispiel dafür, ob der Kontext synchron blockiert wird. Dieser Wert kann veraltet sein, wenn er zurückgegeben wird und nur unter sehr bestimmten Umständen verwendet werden kann.

Operator löschen

Ein Context Objekt wird intern durch die Laufzeit zerstört. Sie kann nicht explizit gelöscht werden.

void operator delete(void* _PObject);

Parameter

_PObject
Ein Zeiger auf das zu löschende Objekt.

Überabonnement

Fügt einem Scheduler für die Dauer eines Codeblocks einen zusätzlichen virtuellen Prozessor hinzu, wenn es in einem Kontext aufgerufen wird, der auf einem der virtuellen Prozessoren dieses Schedulers ausgeführt wird.

static void __cdecl Oversubscribe(bool _BeginOversubscription);

Parameter

_BeginOversubscription
Wenn true, ein Hinweis darauf, dass ein zusätzlicher virtueller Prozessor für die Dauer der Überabonnierung hinzugefügt werden soll. Wenn false, ein Hinweis darauf, dass die Überschreibung enden sollte und der zuvor hinzugefügte virtuelle Prozessor entfernt werden sollte.

ZeitplanGruppenId

Gibt einen Bezeichner für die Zeitplangruppe zurück, an der der aktuelle Kontext arbeitet.

static unsigned int __cdecl ScheduleGroupId();

Rückgabewert

Wenn der aktuelle Kontext an einen Zeitplaner angefügt ist und an einer Terminplangruppe arbeitet, dann handelt es sich um einen Bezeichner für die Terminplangruppe, an der der aktuelle Kontext arbeitet; andernfalls ist der Wert -1.

Entsperren

Hebt die Blockierung des Kontexts auf und bewirkt, dass er ausführbar wird.

virtual void Unblock() = 0;

Hinweise

Es ist vollkommen zulässig, dass ein Aufruf der Unblock Methode vor einem entsprechenden Aufruf der Block-Methode erfolgt. Solange Aufrufe der Block und Unblock Methoden ordnungsgemäß gekoppelt sind, behandelt die Laufzeitumgebung den natürlichen Wettlauf der beiden Abläufe ordnungsgemäß. Ein Unblock Anruf, der vor einem Block Anruf kommt, negiert einfach die Auswirkung des Block Anrufs.

Es gibt mehrere Ausnahmen, die von dieser Methode ausgelöst werden können. Wenn ein Kontext versucht, die Unblock Methode selbst aufzurufen, wird eine context_self_unblock Ausnahme ausgelöst. Wenn Aufrufe an Block und Unblock nicht ordnungsgemäß gekoppelt sind (z. B. werden zwei Aufrufe Unblock für einen Kontext ausgeführt, der derzeit ausgeführt wird), wird eine context_unblock_unbalanced Ausnahme ausgelöst.

Beachten Sie, dass es einen kritischen Zeitraum zwischen dem Punkt gibt, an dem Ihr Code seinen Kontext für einen anderen Thread veröffentlicht, um die Unblock Methode und den Punkt, an dem der tatsächliche Methodenaufruf Block erfolgt, aufrufen zu können. Während dieses Zeitraums dürfen Sie keine Methode aufrufen, die ihrerseits aus spezifischen Gründen blockieren und freigeben kann (z. B. das Erwerben einer Sperre). Aufrufe an die Block und Unblock Methoden verfolgen nicht den Grund für das Blockieren und Aufheben der Blockierung. Ein Objekt sollte die Eigentumsrechte an einem Block- und Unblock-Paar haben.

VirtualProcessorId

Gibt einen Bezeichner für den virtuellen Prozessor zurück, auf dem der aktuelle Kontext ausgeführt wird.

static unsigned int __cdecl VirtualProcessorId();

Rückgabewert

Wenn der aktuelle Kontext an einen Scheduler angefügt ist, wird ein Bezeichner für den virtuellen Prozessor, auf dem der aktuelle Kontext ausgeführt wird, ausgeführt. andernfalls der Wert -1.

Hinweise

Der Rückgabewert dieser Methode ist ein sofortiges Sampling des virtuellen Prozessors, für den der aktuelle Kontext ausgeführt wird. Dieser Wert kann veraltet sein, sobald er zurückgegeben wird, und kann nicht darauf vertraut werden. In der Regel wird diese Methode nur für Debugging- oder Ablaufverfolgungszwecke verwendet.

Ertrag

Gibt die Ausführung frei, damit ein anderer Kontext ausgeführt werden kann. Wenn kein anderer Kontext verfügbar ist, an den gewechselt werden kann, kann der Planer zu einem anderen Betriebssystem-Thread wechseln.

static void __cdecl Yield();

Hinweise

Diese Methode führt dazu, dass der Standardplaner des Prozesses erstellt und/oder an den aufrufenden Kontext angefügt wird, wenn derzeit dem aufrufenden Kontext kein Planer zugeordnet ist.

Ausführungsfreigabe

Gibt die Ausführung frei, damit ein anderer Kontext ausgeführt werden kann. Wenn kein anderer Kontext verfügbar ist, an den gewechselt werden kann, kann der Planer zu einem anderen Betriebssystem-Thread wechseln.

static void __cdecl YieldExecution();

Hinweise

Diese Methode führt dazu, dass der Standardplaner des Prozesses erstellt und/oder an den aufrufenden Kontext angefügt wird, wenn derzeit dem aufrufenden Kontext kein Planer zugeordnet ist.

Diese Funktion ist neu in Visual Studio 2015 und ist identisch mit der Funktion "Ertrag ", steht jedoch nicht im Konflikt mit dem Ertragsmakro in Windows.h.

Siehe auch

Concurrency-Namespace
Scheduler-Klasse
Aufgabenplanung