Context-Klasse
Stellt eine Abstraktion für einen Ausführungskontext dar.
Syntax
class Context;
Member
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 eindeutig ist, zu dem der aktuelle Kontext gehört. |
IsCurrentTaskCollectionCanceling | Gibt zurück, ob die Aufgabenauflistung, die gerade inline für den aktuellen Kontext ausgeführt wird, in diesem Moment (oder in Kürze) einen Abbruch durchführt. |
IsSynchronouslyBlocked | Bestimmt, ob der Kontext synchron blockiert ist. Ein Kontext wird als synchron blockiert angesehen, wenn er explizit eine zu einer Blockierung führende Aktion ausgeführt hat. |
Überzeichnen | Fügt einen zusätzlichen virtuellen Prozessor für die Dauer eines Codeblocks in einen Planer ein, wenn er für einen Kontext aufgerufen wird, der auf einem der virtuellen Prozessoren in diesem Planer ausgeführt wird. |
ScheduleGroupId | Gibt einen Bezeichner für die Planungsgruppe 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 | Setzt die Ausführung aus, damit ein anderer Kontext ausgeführt werden kann. Wenn kein anderer Kontext für eine Übergabe verfügbar ist, kann der Planer ggf. an einen anderen Betriebssystemthread übergeben. |
Hinweise
Der Zeitplan für die Parallelitätslaufzeit (siehe Scheduler) verwendet Ausführungskontexte, um die von Ihrer Anwendung in die Warteschlange eingereihte Arbeit auszuführen. Ein Win32-Thread ist ein Beispiel für einen Ausführungskontext auf einem Windows-Betriebssystem.
Die Nebenläufigkeitsebene eines Planers ist immer gleich der Anzahl virtueller Prozessoren, die vom Ressourcen-Manager gewährt wurden. 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 der Wartevorgang erfüllt wurde, kann solange keine Fortsetzung erfolgen, bis ein verfügbarer virtueller Prozessor vom Planer 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 wiederum aus eigenen Gründen blockieren und entsperren kann (z. B. das Abrufen einer Sperre). Aufrufe an die Block
Und Unblock
Methode 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 für einen anderen Kontext als den aktuellen Kontext aufgerufen wird, kann der Wert veraltet sein, wenn er zurückgegeben wird und nicht darauf vertrauen kann. 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, wird ein Bezeichner für den virtuellen Prozessor, auf dem der Kontext derzeit 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 Kontext ausgeführt wird. Dieser Wert kann veraltet sein, wenn er zurückgegeben wird und nicht darauf vertrauen kann. In der Regel wird diese Methode nur für Debugging- oder Ablaufverfolgungszwecke verwendet.
Kennung
Gibt einen Bezeichner für den aktuellen Kontext zurück, der innerhalb des Planers eindeutig ist, zu dem der aktuelle Kontext gehört.
static unsigned int __cdecl Id();
Rückgabewert
Wenn der aktuelle Kontext einem Scheduler zugeordnet ist, ist ein Bezeichner für den aktuellen Kontext, der innerhalb des Schedulers eindeutig ist, zu dem der aktuelle Kontext gehört; andernfalls der Wert -1
.
IsCurrentTaskCollectionCanceling
Gibt zurück, ob die Aufgabenauflistung, die gerade inline für den aktuellen Kontext ausgeführt wird, in diesem Moment (oder in Kürze) einen Abbruch durchführt.
static bool __cdecl IsCurrentTaskCollectionCanceling();
Rückgabewert
Wenn ein Scheduler mit dem aufrufenden Kontext verknüpft ist und eine Aufgabengruppe einen Vorgang inline in diesem Kontext ausführt, wird angegeben, ob sich diese Aufgabengruppe inmitten eines aktiven Abbruchs befindet (oder kurz sein wird); andernfalls der Wert false
.
IsSynchronouslyBlocked
Bestimmt, ob der Kontext synchron blockiert ist. 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 delete
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.
Überzeichnen
Fügt einen zusätzlichen virtuellen Prozessor für die Dauer eines Codeblocks in einen Planer ein, wenn er für einen Kontext aufgerufen wird, der auf einem der virtuellen Prozessoren in diesem Planer 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 Überschreibung hinzugefügt werden soll. Wenn false
, ein Hinweis darauf, dass die Überschreibung enden sollte und der zuvor hinzugefügte virtuelle Prozessor entfernt werden sollte.
ScheduleGroupId
Gibt einen Bezeichner für die Planungsgruppe 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, ist ein Bezeichner für die Planergruppe, an der der aktuelle Kontext arbeitet; andernfalls 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 Laufzeit das natürliche Rennen einer der beiden Sortierungen 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 wiederum aus eigenen Gründen blockieren und entsperren kann (z. B. das Abrufen einer Sperre). Aufrufe an die Block
Und Unblock
Methode verfolgen nicht den Grund für das Blockieren und Aufheben der Blockierung. Nur ein Objekt sollte über den Besitz eines Und-Paares Block
Unblock
verfügen.
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, wenn er zurückgegeben wird und nicht darauf vertrauen kann. In der Regel wird diese Methode nur für Debugging- oder Ablaufverfolgungszwecke verwendet.
Yield
Setzt die Ausführung aus, damit ein anderer Kontext ausgeführt werden kann. Wenn kein anderer Kontext für eine Übergabe verfügbar ist, kann der Planer ggf. an einen anderen Betriebssystemthread übergeben.
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.
YieldExecution
Setzt die Ausführung aus, damit ein anderer Kontext ausgeführt werden kann. Wenn kein anderer Kontext für eine Übergabe verfügbar ist, kann der Planer ggf. an einen anderen Betriebssystemthread übergeben.
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.