Codi reentrant

De Viquipèdia
Dreceres ràpides: navegació, cerca

En programació la reentrància es refereix a la qualitat d'una subrutina per a ser executada concurrentment d'una forma segura, és a dir, la subrutina es pot invocar mentre s'està executant. Per a tenir aquesta qualitat, la subrutina no pot emmagatzemar dades estàtiques (globals) ni tampoc constants, no ha de retornar la direcció de les dades estàtiques, ni de les constants; ha de treballar només amb les dades proporcionades pel subprograma que l'ha invocat, no ha de tenir exclusió mútua dels recursos construïts sobre el model de Singleton, i al seu torn només ha invocar subrutines que també compleixen amb les qualitats esmentades, és a dir que també siguin reentrants[1]

Múltiples nivells de les tasques prioritàries d'usuari, objectes, processos, o de multiprocés, solen complicar el control de codi reentrant. És important poder fer un seguiment de qualsevol accés o efectes laterals que es produeixin dins una rutina definida com a reentrant.

Exemples[modifica | modifica el codi]

En el codi C de l'esquerra, les funcions f i g no són reentrants. Cal recordar que f depèn de la variable global g_var. Així que si dos fils d'execució criden la funció i accedeixen a g_var a la vegada, el resultat és indeterminat, depenent de la seqüència d'execució. Com g invoca f, no és reentrant. D'altra banda, el codi de la dreta és una versió modificada de l'algorisme no reentrant que elimina l'ús de la característica estàtica, resultant dues funcions reentrants.

No reentrant
int g_var = 1;
 
int f()
{
  g_var = g_var + 2;
  return g_var;
}
 
int g()
{
  return f() + 2;
}
Reentrant
int f(int i)
{
  return i + 2;
}
 
int g(int i)
{
  return f(i) + 2;
}

Referències[modifica | modifica el codi]

  1. Dipak Jha. Use de funcions reentrants per al maneig més segur de senyals (en anglès). IBM, 20 gener 2005 [Consulta: 9 juliol 2008].