Freigeben über


Fasern

Eine Faser- ist eine Einheit der Ausführung, die manuell von der Anwendung geplant werden muss. Fasern werden im Kontext der Threads ausgeführt, die sie planen. Jeder Thread kann mehrere Fasern planen. Im Allgemeinen bieten Fasern keine Vorteile gegenüber einer gut gestalteten Multithreadanwendung. Die Verwendung von Fasern kann es jedoch einfacher machen, Anwendungen zu portieren, die für die Planung ihrer eigenen Threads entwickelt wurden.

Aus Systemsicht gelten Vorgänge, die von einer Faser ausgeführt werden, als vom Thread ausgeführt werden, der sie ausführt. Wenn beispielsweise eine Faser auf lokalen Threadspeicher (TLS) zugreift, greift sie auf den lokalen Threadspeicher des Threads zu, der ihn ausführt. Wenn eine Faser die ExitThread--Funktion aufruft, wird der Thread, der ausgeführt wird, beendet. Eine Faser verfügt jedoch nicht über alle selben Zustandsinformationen, die ihr zugeordnet sind, wie dies mit einem Thread verbunden ist. Die einzigen Zustandsinformationen, die für eine Faser verwaltet werden, sind ihr Stapel, eine Teilmenge ihrer Register und die während der Fasererstellung bereitgestellten Faserdaten. Die gespeicherten Register sind die Registersätze, die in der Regel über einen Funktionsaufruf beibehalten werden.

Fasern werden nicht vorab geplant. Sie planen eine Faser, indem Sie von einer anderen Faser darauf wechseln. Das System plant weiterhin die Ausführung von Threads. Wenn eine Fasern mit Faden vorgedrängt wird, wird ihre derzeit laufende Faser vorgebeutet, bleibt aber ausgewählt. Die ausgewählte Faser wird ausgeführt, wenn ihr Thread ausgeführt wird.

Rufen Sie vor der Planung der ersten Faser die ConvertThreadToFiber--Funktion auf, um einen Bereich zu erstellen, in dem Faserzustandsinformationen gespeichert werden. Der aufrufende Thread ist jetzt die derzeit ausgeführte Faser. Die gespeicherten Zustandsinformationen für diese Faser enthalten die Faserdaten, die als Argument an ConvertThreadToFiberübergeben werden.

Die CreateFiber Funktion wird verwendet, um eine neue Faser aus einer vorhandenen Faser zu erstellen; Der Aufruf erfordert die Stapelgröße, die Startadresse und die Faserdaten. Die Startadresse ist in der Regel eine vom Benutzer bereitgestellte Funktion, die als Faserfunktion bezeichnet wird, die einen Parameter (die Faserdaten) verwendet und keinen Wert zurückgibt. Wenn Ihre Faserfunktion zurückkehrt, wird der Thread, der die Faser ausführt, beendet. Um alle mit CreateFibererstellten Glasfaser auszuführen, rufen Sie die SwitchToFiber--Funktion auf. Sie können SwitchToFiber- mit der Adresse einer Faser aufrufen, die von einem anderen Thread erstellt wurde. Dazu müssen Sie die Adresse an den anderen Thread zurückgegeben haben, wenn sie CreateFiber- aufgerufen wird, und Sie müssen die richtige Synchronisierung verwenden.

Eine Faser kann die Faserdaten abrufen, indem sie das GetFiberData Makro aufruft. Eine Faser kann die Faseradresse jederzeit abrufen, indem sie das GetCurrentFiber Makro aufruft.

Fiber Local Storage

Eine Faser kann faserlokalen Speicher (FLS) verwenden, um eine eindeutige Kopie einer Variablen für jede Faser zu erstellen. Wenn kein Glasfaserwechsel auftritt, verhält sich FLS genau so wie thread local storage. Die FLS-Funktionen (FlsAlloc, FlsFree, FlsGetValueund FlsSetValue) bearbeiten die dem aktuellen Thread zugeordneten FLS. Wenn der Thread eine Faser ausführt und die Faser gewechselt wird, wird auch der FLS umgeschaltet.

Rufen Sie zum Bereinigen der mit einer Faser verbundenen Daten die DeleteFiber--Funktion auf. Diese Daten umfassen den Stapel, eine Teilmenge der Register und die Faserdaten. Wenn die derzeit ausgeführte Glasfaser DeleteFiber-aufruft, ruft der Thread ExitThread- und beendet. Wenn die ausgewählte Faser eines Threads jedoch von einer Faser gelöscht wird, die in einem anderen Thread ausgeführt wird, wird der Thread mit der gelöschten Faser wahrscheinlich ungewöhnlich beendet, da der Faserstapel freigegeben wurde.

Verwendung von Fasern