Fibres
Une fibre est une unité d’exécution qui doit être planifiée manuellement par l’application. Les fibres s’exécutent dans le contexte des threads qui les planifient. Chaque thread peut planifier plusieurs fibres. En général, les fibres ne fournissent pas d’avantages par rapport à une application multithread bien conçue. Toutefois, l’utilisation de fibres peut faciliter le portage d’applications conçues pour planifier leurs propres threads.
Du point de vue du système, les opérations effectuées par une fibre sont considérées comme ayant été effectuées par le thread qui l’exécute. Par exemple, si une fibre accède stockage local de thread (TLS), il accède au stockage local de thread du thread qui l’exécute. En outre, si une fibre appelle la fonction ExitThread, le thread qui l’exécute s’arrête. Toutefois, une fibre n’a pas toutes les mêmes informations d’état associées à celle associée à un thread. Les seules informations d’état conservées pour une fibre sont sa pile, un sous-ensemble de ses registres et les données de fibre fournies lors de la création de fibre. Les registres enregistrés sont l’ensemble des registres généralement conservés dans un appel de fonction.
Les fibres ne sont pas préemptivement planifiées. Vous planifiez une fibre en la basculant à partir d’une autre fibre. Le système planifie toujours l’exécution des threads. Lorsqu’un thread exécutant des fibres est préempté, sa fibre en cours d’exécution est préemptée mais reste sélectionnée. La fibre sélectionnée s’exécute quand son thread s’exécute.
Avant de planifier la première fibre, appelez la fonction ConvertThreadToFiber pour créer une zone dans laquelle enregistrer les informations d’état de fibre. Le thread appelant est maintenant la fibre en cours d’exécution. Les informations d’état stockées pour cette fibre incluent les données fibre transmises en tant qu’argument à ConvertThreadToFiber.
La fonction CreateFiber est utilisée pour créer une fibre à partir d’une fibre existante ; l’appel nécessite la taille de la pile, l’adresse de départ et les données fibre. L’adresse de départ est généralement une fonction fournie par l’utilisateur, appelée fonction fibre, qui prend un paramètre (les données fibre) et ne retourne pas de valeur. Si votre fonction fibre est retournée, le thread qui exécute la fibre s’arrête. Pour exécuter n’importe quelle fibre créée avec CreateFiber, appelez la fonction SwitchToFiber. Vous pouvez appeler SwitchToFiber avec l’adresse d’une fibre créée par un autre thread. Pour ce faire, vous devez retourner l’adresse à l’autre thread lorsqu’elle a appelé CreateFiber et que vous devez utiliser la synchronisation appropriée.
Une fibre peut récupérer les données fibre en appelant la macro GetFiberData. Une fibre peut récupérer l’adresse fibre à tout moment en appelant la macro GetCurrentFiber.
Stockage local fibre
Une fibre peut utiliser stockage local fibre (FLS) pour créer une copie unique d’une variable pour chaque fibre. Si aucun changement de fibre ne se produit, FLS agit exactement comme stockage local de threads. Les fonctions FLS (FlsAlloc, FlsFree, FlsGetValueet FlsSetValue) manipulent le FLS associé au thread actuel. Si le thread exécute une fibre et que la fibre est basculée, le FLS est également basculé.
Pour nettoyer les données associées à une fibre, appelez la fonction DeleteFiber. Ces données incluent la pile, un sous-ensemble des registres et les données fibre. Si les appels fibre en cours d’exécution DeleteFiber, son thread appelle exitThread et se termine. Toutefois, si la fibre sélectionnée d’un thread est supprimée par une fibre s’exécutant dans un autre thread, le thread avec la fibre supprimée est susceptible de se terminer anormalement, car la pile de fibres a été libérée.
Rubriques connexes