Fasern

Eine Faser ist eine Ausführungseinheit, die von der Anwendung manuell 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 konzipierten Multithreadanwendung. Die Verwendung von Fasern kann es jedoch einfacher machen, Anwendungen zu portieren, die zum Planen eigener Threads entwickelt wurden.

Aus Systemsicht gelten von einer Faser ausgeführte Vorgänge als von dem Thread ausgeführt, der sie ausführt. Wenn beispielsweise eine Glasfaser auf den lokalen Threadspeicher (TLS ) zugreift, greift sie auf den lokalen Threadspeicher des Threads zu, der sie ausführt. Wenn eine Glasfaser die ExitThread-Funktion aufruft, wird der Thread, auf dem sie ausgeführt wird, darüber hinaus beendet. Einer Faser sind jedoch nicht alle Zustandsinformationen zugeordnet, die einem Thread zugeordnet sind. Die einzigen Zustandsinformationen, die für eine Faser verwaltet werden, sind der Stapel, eine Teilmenge seiner Register und die Faserdaten, die während der Fasererstellung bereitgestellt werden. Die gespeicherten Register sind die Register, die in der Regel über einen Funktionsaufruf beibehalten werden.

Fasern werden nicht präemptiv geplant. Sie planen eine Faser, indem Sie von einer anderen Faser darauf wechseln. Das System plant weiterhin die Ausführung von Threads. Wenn ein Thread mit Fasern vorzeitig entfernt wird, wird die derzeit ausgeführte Faser vorzeitig entfernt, bleibt aber ausgewählt. Die ausgewählte Faser wird ausgeführt, wenn ihr Thread ausgeführt wird.

Rufen Sie vor dem Planen 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. Für den Aufruf sind die Stapelgröße, die Startadresse und die Glasfaserdaten erforderlich. Die Startadresse ist in der Regel eine vom Benutzer bereitgestellte Funktion, die als Fiberfunktion bezeichnet wird, die einen Parameter (die Faserdaten) akzeptiert und keinen Wert zurückgibt. Wenn Ihre Fiberfunktion zurückgibt, wird der Thread, auf dem die Faser ausgeführt wird, beendet. Um mit CreateFiber erstellte Glasfasern 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 muss die Adresse an den anderen Thread zurückgegeben werden, wenn er CreateFiber aufgerufen hat, und Sie müssen die richtige Synchronisierung verwenden.

Eine Faser kann die Faserdaten abrufen, indem das Makro GetFiberData aufgerufen wird . Eine Faser kann die Fiberadresse jederzeit abrufen, indem das Makro GetCurrentFiber aufgerufen wird.

Lokaler Glasfaserspeicher

Eine Faser kann den lokalen Glasfaserspeicher (Fiber Local Storage , FLS) verwenden, um eine eindeutige Kopie einer Variablen für jede Faser zu erstellen. Wenn kein Faserwechsel erfolgt, funktioniert FLS genau wie der lokale Threadspeicher. Die FLS-Funktionen (FlsAlloc, FlsFree, FlsGetValue und FlsSetValue) bearbeiten die dem aktuellen Thread zugeordnete FLS. Wenn der Thread eine Faser ausführt und die Faser gewechselt wird, wird auch der FLS umgeschaltet.

Rufen Sie die DeleteFiber-Funktion auf, um die einer Faser zugeordneten Daten zu sauber. Diese Daten umfassen den Stapel, eine Teilmenge der Register und die Faserdaten. Wenn die derzeit ausgeführte Glasfaser DeleteFiber aufruft, ruft ihr Thread ExitThread auf und beendet. Wenn die ausgewählte Faser eines Threads jedoch von einer Fasern 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.

Verwenden von Fasern