Réentrance

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

En informatique, la réentrance est la propriété pour une fonction d'être utilisable simultanément par plusieurs tâches utilisatrices. La réentrance permet d'éviter la duplication en mémoire vive d'un programme utilisé simultanément par plusieurs utilisateurs.

L'écriture de code réentrant était autrefois[Quand ?] une tâche très ardue. Elle s'est simplifiée avec les langages actuels qui autorisent :

Le noyau d'un système d'exploitation comporte souvent des parties non réentrantes afin d'éviter des complications fâcheuses (incohérence de données critiques, perte de performances). L'écriture de modules destinés à être exécutés dans l'espace noyau reste, pour cette raison, délicate.

Réentrance et langages de programmation[modifier | modifier le code]

La réentrance des fonctions n'est pas forcément garantie par tous les langages de programmation. Ainsi, par exemple, une fonction écrite en Ada sera toujours réentrant alors qu'une fonction écrit en C ne l'est pas par défaut. La non-réentrance d'une fonction est rarement un problème dans le cas de la programmation monotâche, mais peut produire des résultats désastreux en programmation concurrente.

Relation à « thread-safe »[modifier | modifier le code]

Les deux concepts de réentrance et de thread-safe concernent la manière dont les fonctions gèrent les ressources. Le concept de réentrance a un impact sur l'interface externe de la fonction, alors que le concept de thread-safe concerne le codage de la fonction.

  • Dans la plupart des cas, pour transformer une fonction non réentrante en une fonction réentrante, on doit modifier son interface externe pour que toutes les données soient fournies par l'appelant de la fonction (remplacement des éventuelles variables globales utilisées dans la fonction par des variables locales).
  • Pour rendre thread-safe une fonction non thread-safe, un changement du code seul suffit. De manière usuelle, l'ajout d'un point de synchronisation tel qu'une section critique ou un sémaphore est utilisé pour protéger l'accès a une ressource partagée d'un accès concurrent d'une autre tâche/thread.

Notons qu'aucune de ces propriétés n'implique l'autre :

  • Une fonction thread-safe n'est pas forcément réentrante (le problème se pose toujours dans le cas d'un code exécuté par un thread et un gestionnaire d'interruption).
  • Une fonction réentrante n'est pas forcément thread-safe.

Voir aussi[modifier | modifier le code]