Partager via


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 n’offrent 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 au stockage local de thread (TLS), elle 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 se ferme. Toutefois, une fibre n’a pas toutes les mêmes informations d’état associées que celles associées à 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 la 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 planifiées de manière préventive. Vous planifiez une fibre en basculant vers celle-ci à 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 lorsque 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 la 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 de fibre passées en tant qu’argument à ConvertThreadToFiber.

La fonction CreateFiber est utilisée pour créer une nouvelle 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 retourne, le thread qui exécute la fibre se ferme. Pour exécuter une fibre créée avec CreateFiber, appelez la fonction SwitchToFiber . Vous pouvez appeler SwitchToFiber avec l’adresse d’une fibre créée par un thread différent. Pour ce faire, vous devez avoir retourné l’adresse à l’autre thread quand il a appelé CreateFiber et 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 le stockage local de fibres (FLS) pour créer une copie unique d’une variable pour chaque fibre. Si aucune commutation de fibre ne se produit, FLS agit exactement de la même façon que le stockage local de thread. Les fonctions FLS (FlsAlloc, FlsFree, FlsGetValue et FlsSetValue) manipulent le FLS associé au thread actuel. Si le thread exécute une fibre et que la fibre est commutée, le FLS est également basculé.

Pour propre 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 la fibre en cours d’exécution appelle DeleteFiber, son thread appelle ExitThread et se termine. Toutefois, si la fibre sélectionnée d’un thread est supprimée par une fibre exécutée 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.

Utilisation de fibres