Función reentrante

Se dice que una función es reentrante si hay una disposición para interrumpir la función en el curso de la ejecución, dar servicio a la rutina de servicio de interrupción y luego reanudar la función anterior, sin obstaculizar su curso de acción anterior. Las funciones reentrantes se utilizan en aplicaciones como el manejo de interrupciones de hardware, recursividad, etc.

 
La función debe cumplir ciertas condiciones para ser llamada como reentrante:
1. No puede usar datos globales y estáticos. Aunque no hay restricciones, pero generalmente no se recomienda. porque la interrupción puede cambiar ciertos valores globales y reanudar el curso de acción de la función reentrante con los nuevos datos puede dar resultados no deseados.

 
2. No debe modificar su propio código. Esto es importante porque el curso de acción de la función debe permanecer igual en todo el código. Pero, esto puede permitirse en caso de que la rutina de interrupción use una copia local de la función reentrante cada vez que use valores diferentes o antes y después de la interrupción.
 
3. No debe llamar a otra función no reentrante.

Seguridad de subprocesos y funciones
de reentrada La reentrada es distinta, pero está estrechamente relacionada con la seguridad de subprocesos. Una función puede ser segura para subprocesos y aun así no volver a entrar. Por ejemplo, una función podría envolverse completamente con un mutex (lo que evita problemas en entornos de subprocesos múltiples), pero si esa función se usa en una rutina de servicio de interrupción, podría pasar hambre esperando la primera ejecución para liberar el mutex. La clave para evitar confusiones es que la reentrada se refiere a la ejecución de un solo subproceso. Es un concepto de la época en que no existían sistemas operativos multitarea. (Fuente: https://en.wikipedia.org/wiki/Reentrancy_(informática) )

 
Ejemplo de funciones no reentrantes:

// A non-reentrant example 
// [The function depends on global variable i]
  
int i;
  
// Both fun1() and fun2() are not reentrant
  
// fun1() is NOT reentrant because it uses global variable i
int fun1()
{
    return i * 5;
}
  
// fun2() is NOT reentrant because it calls a non-reentrant
// function
int fun2()
{
   return fun1() * 5;
}

Ejemplo de funciones de reentrada:
en el siguiente código, fun2 es una función de reentrada. Si una interrupción que detiene su ejecución y cambia el control a fun1. Una vez que se completa fun1, el control se transfiere nuevamente a fun2 y vuelve a entrar en la fase de ejecución.

// Both fun1() and fun2() are reentrant
int fun1(int i)
{
    return i * 5;
}
  
int fun2(int i)
{
   return fun1(i) * 5;
}

Artículo recopilado por Venki . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *