Freigeben über


IThreadProxy-Struktur

Eine Abstraktion für einen Ausführungsthread. Abhängig vom SchedulerType-Richtlinienschlüssel des von Ihnen erstellten Planers gewährt der Ressourcen-Manager einen Thread-Proxy, der entweder von einem regulären Win32-Thread oder einem planbaren Benutzermodus-Thread (UMS) unterstützt wird. UMS-Threads werden auf 64-Bit-Betriebssystemen mit Version Windows 7 und höher unterstützt.

Syntax

struct IThreadProxy;

Mitglieder

Öffentliche Methoden

Name Beschreibung
IThreadProxy::GetId Gibt einen eindeutigen Bezeichner für den Threadproxy zurück.
IThreadProxy::SwitchOut Hebt die Zuordnung des Kontexts vom zugrunde liegenden virtuellen Prozessorstamm auf.
IThreadProxy::SwitchTo Führt einen kooperativen Kontextwechsel vom derzeit ausgeführten Kontext zu einem anderen kontext aus.
IThreadProxy::YieldToSystem Bewirkt, dass der aufrufende Thread die Ausführung an einen anderen Thread übergibt, der auf dem aktuellen Prozessor ausgeführt werden kann. Das Betriebssystem wählt den nächsten thread aus, der ausgeführt werden soll.

Hinweise

Thread-Proxys werden mit Ausführungskontexten gekoppelt, die durch die Schnittstelle IExecutionContext als Mittel zur Verteilung von Aufgaben dienen.

Vererbungshierarchie

IThreadProxy

Anforderungen

Kopfzeile: concrtrm.h

Namespace: Parallelität

IThreadProxy::GetId-Methode

Gibt einen eindeutigen Bezeichner für den Threadproxy zurück.

virtual unsigned int GetId() const = 0;

Rückgabewert

Ein eindeutiger ganzzahliger Bezeichner.

IThreadProxy::SwitchOut-Methode

Hebt die Zuordnung des Kontexts vom zugrunde liegenden virtuellen Prozessorstamm auf.

virtual void SwitchOut(SwitchingProxyState switchState = Blocking) = 0;

Parameter

switchState
Gibt den Zustand des Threadproxys an, der den Wechsel ausführt. Der Parameter ist vom Typ SwitchingProxyState.

Hinweise

Verwenden Sie SwitchOut, wenn Sie aus irgendeinem Grund die Zuordnung eines Kontexts zu einem virtuellen Prozessorstamm aufheben müssen, in dem dieser ausgeführt wird. Je nachdem, welchen Wert Sie an den switchState-Parameter übergeben, und abhängig von dessen Ausführung auf einem virtuellen Prozessorstamm, wird der Aufruf entweder sofort zurückgegeben oder der dem Kontext zugeordnete Threadproxy wird blockiert. Es ist nicht zulässig, SwitchOut aufzurufen, wenn der Parameter auf Idle festgelegt ist. Dies führt zu einer invalid_argument Ausnahme.

SwitchOut ist nützlich, wenn Sie die Anzahl der virtuellen Prozessorwurzeln Ihres Schedulers verringern möchten. Dies kann entweder auf Anweisung des Ressourcen-Managers geschehen oder weil Sie eine vorübergehend überrichtete virtuelle Prozessorwurzel angefordert haben und diese jetzt nicht mehr benötigen. In diesem Fall sollten Sie die Methode IVirtualProcessorRoot::Remove auf dem virtuellen Prozessorstamm aufrufen, bevor Sie einen Aufruf an SwitchOut ausführen und den Parameter auf switchState festlegen Blocking. Auf diese Weise wird der Threadproxy blockiert. Die Ausführung wird fortgesetzt, wenn im Planer ein anderer virtueller Prozessorstamm für die Ausführung verfügbar ist. Die Ausführung des blockierten Threadproxys kann fortgesetzt werden, indem die SwitchTo-Funktion aufgerufen wird, um zum Ausführungskontext dieses Threadproxys zu wechseln. Sie können den Threadproxy auch fortsetzen, indem Sie dessen zugeordneten Kontext verwenden, um den Stamm eines virtuellen Prozessors zu aktivieren. Weitere Informationen dazu finden Sie unter IVirtualProcessorRoot::Activate.

Sie können SwitchOut auch verwenden, um den virtuellen Prozessor neu zu initialisieren, damit er in Zukunft aktiviert werden kann, indem Sie entweder den Thread-Proxy blockieren oder ihn vorübergehend von der virtuellen Prozessorwurzel, auf der er läuft, und vom Scheduler, für den er Aufgaben verteilt, trennen. Verwenden Sie SwitchOut mit dem auf switchState festgelegten Blocking-Parameter, wenn Sie den Threadproxy blockieren möchten. Wie oben beschrieben, kann er zu einem späteren Zeitpunkt mithilfe von SwitchTo oder IVirtualProcessorRoot::Activate fortgesetzt werden. Verwenden Sie SwitchOut mit dem auf Nesting festgelegten Parameter, wenn Sie diesen Threadproxy vorübergehend vom Stamm des virtuellen Prozessors, auf dem er ausgeführt wird, und vom Planer, dem der virtuelle Prozessor zugeordnet ist, trennen möchten. Das Aufrufen von SwitchOut mit dem Parameter switchState, der auf Nesting festgelegt ist, führt bei dessen Ausführung auf einem virtuellen Prozessorstamm zu einer erneuten Initialisierung des Stamms und zur Fortsetzung des aktuellen Thread-Proxys ohne die Notwendigkeit eines zusätzlichen. Der Threadproxy gilt als aus dem Scheduler ausgeschieden, bis er die IThreadProxy::SwitchOut-Methode zu einem späteren Zeitpunkt aufruft. Der zweite Aufruf von SwitchOut mit dem auf Blocking festgelegten Parameter soll den Kontext in einen blockierten Zustand zurückversetzen, damit er im Planer, von dem er getrennt ist, mit SwitchTo oder IVirtualProcessorRoot::Activate fortgesetzt werden kann. Da die Ausführung nicht auf einem virtuellen Prozessorstamm erfolgt, findet keine erneute Initialisierung statt.

Ein erneut initialisierter virtueller Prozessorstamm unterscheidet sich nicht von einem neuen virtuellen Prozessorstamm, der dem Planer vom Ressourcen-Manager gewährt wurde. Sie können ihn für die Ausführung verwenden, indem Sie ihn mit IVirtualProcessorRoot::Activate in einem Ausführungskontext aktivieren.

SwitchOut muss für die IThreadProxy-Schnittstelle aufgerufen werden, die den gerade ausgeführten Thread darstellt, oder die Ergebnisse sind nicht definiert.

In den Bibliotheken und Headern, die mit Visual Studio 2010 geliefert wurden, weist diese Methode keinen Parameter auf, und der virtuelle Prozessorstamm wurde nicht initialisiert. Um altes Verhalten beizubehalten, wird der Standardparameterwert von Blocking angegeben.

IThreadProxy::SwitchTo-Methode

Führt einen kooperativen Kontextwechsel vom derzeit ausgeführten Kontext zu einem anderen kontext aus.

virtual void SwitchTo(
    _Inout_ IExecutionContext* pContext,
    SwitchingProxyState switchState) = 0;

Parameter

pContext
Der Ausführungskontext, zu dem kooperativ gewechselt werden soll.

switchState
Gibt den Zustand des Threadproxys an, der den Wechsel ausführt. Der Parameter ist vom Typ SwitchingProxyState.

Hinweise

Verwenden Sie diese Methode, um von einem Ausführungskontext zu einem anderen zu wechseln, von der IExecutionContext::Dispatch Methode des ersten Ausführungskontexts. Die Methode ordnet den Ausführungskontext pContext einem Threadproxy zu, wenn er noch nicht einem zugeordnet ist. Der Besitz des aktuellen Threadproxys wird durch den Wert bestimmt, den Sie für das switchState Argument angeben.

Verwenden Sie den Wert Idle , wenn Sie den derzeit ausgeführten Threadproxy an den Ressourcen-Manager zurückgeben möchten. Das Aufrufen von SwitchTo mit dem Parameter switchState, der auf Idle festgelegt ist, bewirkt, dass der Ausführungskontext pContext auf der zugrunde liegenden Ausführungsressource startet. Der Besitz dieses Threadproxys wird an den Ressourcen-Manager übertragen, und Sie werden voraussichtlich bald nach Dispatch der Rückgabe aus der Methode des Ausführungskontexts SwitchTo zurückkehren, um die Übertragung abzuschließen. Der Ausführungskontext, den der Threadproxy verteilt hat, wird vom Threadproxy getrennt, und der Scheduler kann ihn wiederverwenden oder nach Bedarf zerstören.

Verwenden Sie den Wert Blocking , wenn dieser Threadproxy einen blockierten Zustand eingeben soll. Das Aufrufen von SwitchTo mit dem Parameter switchState, der auf Blocking festgelegt ist, bewirkt, dass der Ausführungskontext pContext gestartet wird, und blockiert den aktuellen Thread-Proxy, bis er wiederaufgenommen wird. Der Scheduler behält den Besitz des Threadproxys bei, wenn sich der Threadproxy im Blocking Zustand befindet. Die Ausführung des blockierten Threadproxys kann fortgesetzt werden, indem die SwitchTo-Funktion aufgerufen wird, um zum Ausführungskontext dieses Threadproxys zu wechseln. Sie können den Threadproxy auch fortsetzen, indem Sie dessen zugeordneten Kontext verwenden, um den Stamm eines virtuellen Prozessors zu aktivieren. Weitere Informationen dazu finden Sie unter IVirtualProcessorRoot::Activate.

Verwenden Sie den Wert Nesting , wenn Sie diesen Threadproxy vorübergehend von dem virtuellen Prozessorstamm trennen möchten, auf dem er ausgeführt wird, sowie von dem Scheduler, für den er Aufgaben verteilt. Das Aufrufen SwitchTo mit dem Parametersatz switchStateNesting bewirkt, dass der Ausführungskontext pContext gestartet wird und der aktuelle Threadproxy auch weiterhin ausgeführt wird, ohne dass ein virtueller Prozessorstamm erforderlich ist. Der Threadproxy gilt als hätte er den Scheduler verlassen, bis er zu einem späteren Zeitpunkt die Methode IThreadProxy::SwitchOut aufruft. Die IThreadProxy::SwitchOut Methode könnte den Threadproxy blockieren, bis ein virtueller Prozessorstamm verfügbar ist, um ihn neu zu planen.

SwitchTo muss für die IThreadProxy-Schnittstelle aufgerufen werden, die den gerade ausgeführten Thread darstellt, oder die Ergebnisse sind nicht definiert. Die Funktion wirft eine Ausnahme invalid_argument, wenn der Parameter pContext auf NULL gesetzt ist.

IThreadProxy::YieldToSystem-Methode

Bewirkt, dass der aufrufende Thread die Ausführung an einen anderen Thread übergibt, der auf dem aktuellen Prozessor ausgeführt werden kann. Das Betriebssystem wählt den nächsten thread aus, der ausgeführt werden soll.

virtual void YieldToSystem() = 0;

Hinweise

Wenn sie von einem Threadproxy aufgerufen wird, der von einem regulären Windows-Thread unterstützt wird, YieldToSystem verhält sich das Verhalten genau wie die Windows-Funktion SwitchToThread. Wenn sie jedoch von UMS-Threads (User-Mode schedulable) aufgerufen wird, delegiert die SwitchToThread-Funktion die Aufgabe, den nächsten auszuführenden Thread auszuwählen, an den Benutzermodusplaner, nicht an das Betriebssystem. Um den gewünschten Effekt des Wechsels zu einem anderen einsatzbereiten Thread im System zu erzielen, verwenden Sie YieldToSystem.

YieldToSystem muss für die IThreadProxy-Schnittstelle aufgerufen werden, die den gerade ausgeführten Thread darstellt, oder die Ergebnisse sind nicht definiert.

Siehe auch

Concurrency-Namespace
IExecutionContext-Struktur
IScheduler-Struktur
IVirtualProcessorRoot-Struktur