Réentrance
# Réentrance

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. Si une fonction de plusieurs threads doit accéder à une variable globale, il suffit de l'encadrer par des Mutex.

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

* l'allocation dynamique de mémoire,
* la séparation, dans des segments distincts, du code et des données,
* la gestion de piles.

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

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éentrante alors qu'une fonction écrite 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 »

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 à 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.
