Freigeben über


IThreadProxy-Struktur

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

Syntax

struct IThreadProxy;

Member

Ö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

Threadproxys werden mit Ausführungskontexten gekoppelt, die durch die Schnittstelle IExecutionContext als Verteilerarbeit dargestellt werden.

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 Stämme virtueller Prozessoren für den Planer verringern möchten, da der Ressourcen-Manager Sie angewiesen hat, dies zu tun oder Sie den Stamm eines überzeichneten temporären virtuellen Prozessors angefordert haben und diesen nicht mehr benötigen. In diesem Fall sollten Sie die Methode "IVirtualProcessorRoot::Remove" im Stammverzeichnis des virtuellen Prozessors aufrufen, bevor Sie einen Aufruf mit SwitchOut dem Parameter ausführen, auf Blockingden der Parameter switchState festgelegt ist. 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 zudem verwenden, um den virtuellen Prozessor erneut zu initialisieren, damit dieser zukünftig aktiviert werden kann, wenn Sie den Threadproxy blockieren oder vorübergehend vom Stamm des virtuellen Prozessors, für den dieser ausgeführt wird, und vom Planer, für den er Arbeit verteilt, trennen möchten. 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 auf switchState festgelegten Nesting-Parameter führt während dessen Ausführung auf einem virtuellen Prozessorstamm zu einer erneuten Initialisierung des Stamms und zur Fortsetzung des aktuellen Threadproxys, obwohl dieser nicht erforderlich ist. Der Threadproxy wird angenommen, dass er den Scheduler verlassen hat, bis er die IThreadProxy::SwitchOut-Methode zu Blocking 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::D ispatch-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 SwitchTo mit dem Parameter switchState , der festgelegt ist, Idle bewirkt, dass der Ausführungskontext pContext für die zugrunde liegende Ausführungsressource gestartet wird. Der Besitz dieses Threadproxys wird an den Ressourcen-Manager übertragen, und Sie werden voraussichtlich bald nach SwitchTo der Rückgabe aus der Methode des Ausführungskontexts Dispatch 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 SwitchTo mit dem Parameter switchState , der festgelegt ist Blocking , bewirkt, dass der Ausführungskontext pContext gestartet wird, und blockiert den aktuellen Threadproxy, bis er fortgesetzt 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 vom virtuellen Prozessorstamm trennen möchten, auf dem er ausgeführt wird, und der Zeitplan, für den er verteilt wird. Das Aufrufen SwitchTo mit dem Parametersatz Nesting switchState 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 wird angenommen, dass er den Scheduler verlassen hat, bis er die IThreadProxy::SwitchOut-Methode zu einem späteren Zeitpunkt 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 löst aus invalid_argument , wenn der Parameter pContext auf NULL.

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, UMS) aufgerufen wird, delegiert die SwitchToThread Funktion die Aufgabe, den nächsten Thread zu wählen, der an den Benutzermodusplaner ausgeführt werden soll, nicht 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