Reentrada

Un programa de computadora en su conjunto o su procedimiento por separado se denomina reentrante si  está diseñado de tal manera que la misma copia de las instrucciones del programa en la memoria puede ser compartida por varios usuarios o procesos. Al mismo tiempo, el segundo usuario puede llamar al código reentrante antes de que el primer usuario termine de trabajar con él, y esto al menos no debería conducir a un error, y si se implementa correctamente, no debería causar la pérdida de cálculos (es decir, no no debería ser necesario ejecutar fragmentos de código ya ejecutados).  

La reentrada está estrechamente relacionada con la seguridad de una función en un entorno multiproceso ( thread-safety ), sin embargo, estos son conceptos diferentes. Garantizar la reentrada es clave cuando se programan sistemas multitarea, en particular , sistemas operativos .

Para garantizar la reentrada, se deben cumplir varias condiciones:

En general, la reentrada requiere que el proceso o función que llama pase todos los datos necesarios al proceso llamado cada vez. Así, una función que dependa sólo de sus parámetros, no utilice variables globales o estáticas, y sólo llame a funciones reentrantes, será reentrante. Si la función usa variables globales o estáticas, debe asegurarse de que cada usuario mantenga su propia copia local de estas variables.

Ejemplo

En el siguiente fragmento de código, las funciones f() y g() no son reentrantes.

int g_var = 1; intf() { g_var = g_var + 2; devuelve g_var; } intg() { devolver f() + 2; }

Aquí, f() depende de la variable global g_var , por lo que si dos procesos llaman a f() al mismo tiempo, el resultado es impredecible. Por lo tanto, f() no es reentrante. Pero g() tampoco es reentrante, porque usa la función no reentrante f() .

En el siguiente fragmento de código, la función accum() tampoco es reentrante.

int acumular(int b) { int estático a = 0; ++a; retorno(a+b); }

Aquí accum  es una función que acumula el valor de a , del cual es responsable la variable estática. Si accum es llamado por diferentes procesos, el resultado también será impredecible. Como en el ejemplo anterior, todos los procesos que llaman comparten a .

Además, la pérdida de reentrada puede ocurrir cuando la misma variable se usa más de una vez en una expresión.

#define SQR(x) ((x)*(x)) función vacía (vacío) { entero x, y; x = SQR(y); }

En este caso, la macro SQR(x) no funcionará correctamente si cambia cada vez que se accede al argumento.

Enlaces