Codi reentrant
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]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.
int g_var = 1;
int f()
{
g_var = g_var + 2;
return g_var;
}
int g()
{
return f() + 2;
}
|
int f(int i)
{
return i + 2;
}
int g(int i)
{
return f(i) + 2;
}
|
Referències
[modifica]- ↑ 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].