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 Blocking
den 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