Delen via


Vezels

Een fiber is een uitvoeringseenheid die handmatig door de toepassing moet worden gepland. Vezels worden uitgevoerd in de context van de threads die ze plannen. Elke thread kan meerdere vezels plannen. Over het algemeen bieden vezels geen voordelen ten opzichte van een goed ontworpen multithreaded toepassing. Het gebruik van vezels kan het echter eenvoudiger maken om toepassingen te overzetten die zijn ontworpen om hun eigen threads te plannen.

Vanuit het oogpunt van een systeem worden bewerkingen die door een glasvezel worden uitgevoerd, beschouwd als uitgevoerd door de thread die deze uitvoert. Als een glasvezel bijvoorbeeld toegang heeft tot lokale opslag van threads (TLS), heeft deze toegang tot de lokale threadopslag van de thread waarop deze wordt uitgevoerd. Bovendien, als een glasvezel de ExitThread functie aanroept, wordt de thread die wordt uitgevoerd, afgesloten. Een vezel heeft echter niet dezelfde statusinformatie die eraan is gekoppeld als die gekoppeld aan een thread. De enige staatsinformatie die wordt onderhouden voor een vezel is de stapel, een subset van de registers en de glasvezelgegevens die tijdens het maken van vezels worden verstrekt. De opgeslagen registers zijn de set registers die doorgaans behouden blijven tijdens een functieoproep.

Vezels worden niet preventief gepland. U plant een glasvezel door over te schakelen van een andere vezel. Het systeem plant nog steeds threads die moeten worden uitgevoerd. Wanneer een thread waarop vezels worden uitgevoerd, wordt de huidige actieve vezel verpretentied, maar blijft geselecteerd. De geselecteerde vezel wordt uitgevoerd wanneer de thread wordt uitgevoerd.

Voordat u de eerste glasvezel plant, roept u de ConvertThreadToFiber--functie aan om een gebied te maken waarin de informatie over de glasvezelstatus moet worden opgeslagen. De aanroepende thread is nu de momenteel uitgevoerde glasvezel. De informatie over de opgeslagen status voor deze glasvezel bevat de glasvezelgegevens die als argument zijn doorgegeven aan ConvertThreadToFiber-.

De functie CreateFiber wordt gebruikt om een nieuwe vezel van een bestaande vezel te maken; voor de aanroep is de stackgrootte, het beginadres en de glasvezelgegevens vereist. Het beginadres is doorgaans een door de gebruiker geleverde functie, de glasvezelfunctie, die één parameter (de glasvezelgegevens) gebruikt en geen waarde retourneert. Als uw glasvezelfunctie retourneert, wordt de draad waarop de vezels worden uitgevoerd, afgesloten. Als u vezels wilt uitvoeren die zijn gemaakt met CreateFiber-, roept u de functie SwitchToFiber- aan. U kunt SwitchToFiber- aanroepen met het adres van een glasvezel die is gemaakt door een andere thread. Hiervoor moet het adres worden geretourneerd naar de andere thread wanneer het CreateFiber- wordt aangeroepen en moet u de juiste synchronisatie gebruiken.

Een glasvezel kan de glasvezelgegevens ophalen door de GetFiberData macro aan te roepen. Een glasvezel kan het glasvezeladres op elk gewenst moment ophalen door de GetCurrentFiber macro aan te roepen.

Lokale glasvezelopslag

Een glasvezel kan lokale opslag van vezels (FLS) gebruiken om een unieke kopie van een variabele voor elke vezel te maken. Als er geen glasvezelwisseling plaatsvindt, werkt FLS precies hetzelfde als lokale opslag van threads. De functies FLS (FlsAlloc, FlsFree, FlsGetValueen FlsSetValue) bewerken de FLS die aan de huidige thread is gekoppeld. Als de draad een glasvezel uitvoert en de vezel wordt geschakeld, wordt de FLS ook geschakeld.

Als u de gegevens wilt opschonen die zijn gekoppeld aan een glasvezel, roept u de functie DeleteFiber aan. Deze gegevens omvatten de stack, een subset van de registers en de glasvezelgegevens. Als de momenteel actieve fiber-aanroepen DeleteFiber-, worden de thread-aanroepen ExitThread beëindigd en beëindigd. Als de geselecteerde vezels van een thread echter worden verwijderd door een vezel die in een andere thread wordt uitgevoerd, zal de thread met de verwijderde vezel waarschijnlijk abnormaal beëindigen omdat de glasvezelstack is vrijgemaakt.

vezels gebruiken