Fasern

Eine Fiber ist eine Ausführungseinheit, die von der Anwendung manuell geplant werden muss. Fibers werden im Kontext der Threads ausgeführt, die sie planen. Jeder Thread kann mehrere Fibers planen. Im Allgemeinen bieten Fibers keine Vorteile gegenüber einer gut entworfenen Multithreadanwendung. Die Verwendung von Fibers kann jedoch das Portieren von Anwendungen vereinfachen, die für die Planung ihrer eigenen Threads entwickelt wurden.

Aus Systemsicht geht eine Fiber von der Identität des Threads aus, der sie ausführt. Wenn beispielsweise ein Fiber auf den lokalen Threadspeicher (Thread Local Storage, TLS) zugreift, greift er auf den lokalen Threadspeicher des Threads zu, der ihn ausführt. Wenn eine Fiber außerdem die ExitThread-Funktion aufruft, wird der Thread, der sie ausführt, beendet. Einer Fiber sind jedoch nicht alle Zustandsinformationen zugeordnet, die einem Thread zugeordnet sind. Die einzigen Zustandsinformationen, die für eine Fiber beibehalten werden, sind der Stapel, eine Teilmenge der Register und die fiber-Daten, die während der Fibererstellung bereitgestellt werden. Die gespeicherten Register sind die Register, die in der Regel während eines Funktionsaufrufs beibehalten werden.

Fibers sind nicht präemptiv geplant. Sie planen eine Fiber, indem Sie von einer anderen Fiber zu ihr wechseln. Das System plant weiterhin die Ausführung von Threads. Wenn ein Thread mit Fibers vorzeitig beendet wird, wird die aktuell ausgeführte Fiber vorzeitig beendet, bleibt aber ausgewählt. Die ausgewählte Fiber wird ausgeführt, wenn ihr Thread ausgeführt wird.

Rufen Sie vor dem Planen der ersten Fiber die ConvertThreadToFiber-Funktion auf, um einen Bereich zum Speichern von Fiberzustandsinformationen zu erstellen. Der aufrufende Thread ist jetzt die derzeit ausgeführte Fiber. Die gespeicherten Zustandsinformationen für diese Fiber enthalten die Fiberdaten, die als Argument an ConvertThreadToFiber übergeben werden.

Die CreateFiber-Funktion wird verwendet, um eine neue Fiber aus einer vorhandenen Fiber zu erstellen. der Aufruf erfordert die Stapelgröße, die Startadresse und die Fiberdaten. Die Startadresse ist in der Regel eine vom Benutzer bereitgestellte Funktion, die als Fiberfunktion bezeichnet wird und einen Parameter (die Fiberdaten) annimmt und keinen Wert zurückgibt. Wenn Ihre Fiberfunktion zurückgegeben wird, wird der Thread, der die Fiber ausführt, beendet. Rufen Sie die SwitchToFiber-Funktion auf, um eine fiber-Funktion auszuführen, die mit CreateFiber erstellt wurde. Sie können SwitchToFiber mit der Adresse einer Fiber 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 Fiber kann die Fiberdaten abrufen, indem sie das GetFiberData-Makro aufruft. Eine Fiber kann die Fiberadresse jederzeit abrufen, indem sie das GetCurrentFiber-Makro aufruft.

Fiber Local Storage

Eine Fiber kann fibre local storage (FLS) verwenden, um eine eindeutige Kopie einer Variablen für jede Fiber zu erstellen. Wenn kein Fiberwechsel erfolgt, verhält sich FLS genau wie der lokale Threadspeicher. Die FLS-Funktionen (FlsAlloc, FlsFree, FlsGetValueund FlsSetValue) bearbeiten den FLS, der dem aktuellen Thread zugeordnet ist. Wenn der Thread eine Fiber ausführt und die Fiber umgeschaltet wird, wird auch der FLS gewechselt.

Um die einer Fiber zugeordneten Daten zu bereinigen, rufen Sie die DeleteFiber-Funktion auf. Diese Daten umfassen den Stapel, eine Teilmenge der Register und die Fiberdaten. Wenn die aktuell ausgeführte Fiber DeleteFiber aufruft, ruft der Thread ExitThread auf und wird beendet. Wenn die ausgewählte Fiber eines Threads jedoch von einer Fiber gelöscht wird, die in einem anderen Thread ausgeführt wird, wird der Thread mit der gelöschten Fiber wahrscheinlich ungewöhnlich beendet, da der Fiberstapel freigegeben wurde.

Verwenden von Fibers