Réentrance

Définition, exemples et bonnes pratiques

À retenir

  • Permet l'exécution simultanée par plusieurs tâches sans conflit.
  • Interdit l'usage de variables globales ou partagées.
  • Crucial pour la stabilité des systèmes d'exploitation et de l'embarqué.

La réentrance est la capacité d'un morceau de code (une fonction) à être interrompu en plein milieu de son exécution, puis à être relancé en toute sécurité avant que le premier appel ne soit terminé. C'est un peu comme une recette de cuisine que plusieurs cuisiniers pourraient commencer à suivre à des moments différents en utilisant leurs propres ingrédients, sans jamais mélanger leurs plats respectifs.

Étymologie

Vient de l'anglais reentrancy, formé de re- (à nouveau) et enter (entrer). Ce concept est né avec l'apparition du multitâche dans les années 1960, quand les ordinateurs ont commencé à devoir gérer plusieurs programmes ou interruptions simultanément.

Exemples d'usage

  • Une fonction mathématique simple comme carre(x) qui multiplie un nombre par lui-même est réentrante car elle ne dépend que de son paramètre d'entrée.
  • Une fonction de traitement de texte qui utilise une variable globale pour stocker le dernier mot tapé n'est pas réentrante, car un deuxième appel écraserait la valeur du premier.

Cas d'usage

Ce concept intervient principalement dans la programmation système, le développement de pilotes de périphériques et les systèmes temps réel où une interruption matérielle peut forcer le processeur à exécuter une fonction alors qu'il était déjà en train de l'utiliser pour une autre tâche.

Bonnes pratiques

Pour garantir la réentrance, une fonction ne doit jamais modifier de variables globales ou statiques. Elle doit uniquement travailler avec des variables locales (stockées sur la pile) ou des données qui lui sont explicitement fournies en paramètres. Elle ne doit pas non plus appeler d'autres fonctions qui ne sont pas elles-mêmes réentrantes.

Synonymes

code réentrant fonction pure (proche)

Antonymes

non-réentrant fonction à état global

Conseil

Pour vous assurer qu'une fonction est réentrante quand vous débutez, demandez-vous : 'Si mon code s'arrête à n'importe quelle ligne et qu'une autre instance de moi-même démarre, est-ce que mes données actuelles seront encore valides quand je reprendrai ?'. Si la réponse est oui, vous êtes sur la bonne voie.

Questions fréquentes

Est-ce la même chose que le thread-safe ?

Pas tout à fait. Une fonction réentrante est généralement thread-safe, mais une fonction thread-safe n'est pas forcément réentrante (par exemple si elle utilise des verrous qui pourraient causer un blocage lors d'une interruption).

Pourquoi est-ce important ?

Sans réentrance, un programme peut subir des bugs imprévisibles et très difficiles à corriger lorsque plusieurs actions se produisent en même temps.