Dela via


Fibrer

En fiber är en körningsenhet som måste schemaläggas manuellt av programmet. Fibrer körs i kontexten för de trådar som schemalägger dem. Varje tråd kan schemalägga flera fibrer. I allmänhet ger fibrer inte fördelar jämfört med ett väldesignat flertrådat program. Att använda fibrer kan dock göra det enklare att porta program som har utformats för att schemalägga sina egna trådar.

Ur systemsynpunkt anses åtgärder som utförs av en fiber ha utförts av tråden som kör den. Om en fiber till exempel kommer åt trådlokal lagring (TLS) kommer den åt trådens lokala lagring för tråden som kör den. Om en fiber dessutom anropar funktionen ExitThread avslutas tråden som kör den. En fiber har dock inte samma tillståndsinformation som är associerad med den som är associerad med en tråd. Den enda tillståndsinformation som underhålls för en fiber är dess stack, en delmängd av dess register och de fiberdata som tillhandahålls under fiberskapandet. De sparade registren är den uppsättning register som vanligtvis bevaras i ett funktionsanrop.

Fibrer är inte förebyggande schemalagda. Du schemalägger en fiber genom att byta till den från en annan fiber. Systemet schemalägger fortfarande trådar som ska köras. När en tråd som kör fibrer föregrips, är dess nuvarande löpfiber förinstallerad men förblir vald. Den valda fibern körs när tråden körs.

Innan du schemalägger den första fibern anropar du funktionen ConvertThreadToFiber för att skapa ett område där fibertillståndsinformation ska sparas. Den anropande tråden är nu den som kör fiber. Den lagrade tillståndsinformationen för den här fibern innehåller fiberdata som skickas som ett argument till ConvertThreadToFiber.

Funktionen CreateFiber används för att skapa en ny fiber från en befintlig fiber. anropet kräver stackstorleken, startadressen och fiberdata. Startadressen är vanligtvis en funktion som tillhandahålls av användaren, kallad fiberfunktionen, som tar en parameter (fiberdata) och inte returnerar något värde. Om fiberfunktionen returnerar avslutas tråden som kör fibern. Om du vill köra alla fibrer som skapats med CreateFiberanropar du funktionen SwitchToFiber. Du kan anropa SwitchToFiber med adressen för en fiber som skapats av en annan tråd. För att göra detta måste adressen returneras till den andra tråden när den anropade CreateFiber och du måste använda korrekt synkronisering.

En fiber kan hämta fiberdata genom att anropa makrot GetFiberData. En fiber kan hämta fiberadressen när som helst genom att anropa GetCurrentFiber makro.

Lokal fiberlagring

En fiber kan använda fiber lokal lagring (FLS) för att skapa en unik kopia av en variabel för varje fiber. Om ingen fiberväxling sker fungerar FLS exakt på samma sätt som trådlokal lagring. FLS-funktionerna (FlsAlloc, FlsFree, FlsGetValueoch FlsSetValue) ändrar den FLS som är associerad med den aktuella tråden. Om tråden kör en fiber och fibern byts, växlas FLS också.

Om du vill rensa data som är associerade med en fiber anropar du funktionen DeleteFiber. Dessa data innehåller stacken, en delmängd av registren och fiberdata. Om den fiber som körs anropar DeleteFiberanropar tråden ExitThread och avslutas. Men om den valda fibern i en tråd tas bort av en fiber som körs i en annan tråd, kommer tråden med den borttagna fibern sannolikt att avsluta onormalt eftersom fiberstacken har frigjorts.

Använda fibrer