language agnostic - usa - ¿Cuál es la diferencia entre la función de reentrada y la función recursiva en C?
recursividad en programacion java (8)
En CI conozco la función recursiva, pero escuché acerca de la función de reentrada.
¿Que es eso? ¿Y cuál es la diferencia entre ellos?
Es más fácil de recordar cuando entiendes lo que significa el término.
El término "reentrante" significa que es seguro " reingresar " la función mientras ya se está ejecutando, generalmente en un entorno concurrente.
En otras palabras, cuando dos tareas pueden ejecutar la función al mismo tiempo sin interferir entre sí, entonces la función vuelve a entrar. Una función no es reentrante cuando la ejecución por una tarea tiene un impacto en la influencia de otra tarea. Este suele ser el caso cuando se utiliza un estado o datos globales. Una función que usa solo variables y argumentos locales suele ser reentrante.
La "reentrada" de una función se produce cuando se invoca antes de que haya regresado una invocación anterior. Hay tres razones principales para que esto ocurra: recursión (la función se llama a sí misma), multi-threading e interrupción. La recursividad es normalmente más fácil, ya que está claro que la función se volverá a ingresar. La interconexión múltiple y la interrupción son más complicadas, ya que la reentrada será asincrónica. Como se indica en otras respuestas, en la mayoría de los casos, la función no debe modificar datos globales (leer datos globales está bien, algunos reyes de escritura están bien si están protegidos como secciones críticas).
Lo que originalmente se dijo originalmente es correcto, excepto que no está limitado a multi-threading (también, proteger los datos globales con bloqueos lo hace seguro para el hilo pero no necesariamente reentrante). [Editar] Ha arreglado su publicación para dar cuenta de esto ahora :-)
También se puede volver a introducir una función en el mismo hilo como resultado de la recursión, ya sea directa o indirectamente (es decir, la función a llama a la función b que llama a la función c que llama a la función a).
Por supuesto, si ha protegido contra la reentrada sobre la base de que múltiples hilos pueden llamarlo, entonces también está cubierto para los casos recursivos. Sin embargo, eso no es cierto al revés.
Una función es reingresante si es compatible con tener múltiples hilos de ejecución "atravesándola" al mismo tiempo. Esto podría deberse a un subprocesamiento múltiple real, y utilizo este caso a continuación, o debido a otras cosas como lo señalan otros carteles. Multi-threading fue lo primero que se me vino a la mente, y quizás también es el más fácil de entender, así que me centré en ese caso.
Esto significa que la función no puede usar datos "globales" estáticos, ya que se accedería a esos datos por dos (o más) hilos en paralelo, a menudo rompiendo horriblemente. Una función de reentrada a menudo tiene un argumento explícito para retener cualquier estado específico de la llamada, en lugar de almacenarlo estáticamente.
strtok()
es un caso clásico de una función en la biblioteca estándar C que es bien conocida por no ser reentrante.
[Editar]: hay un montón de ideas, aclaraciones y correcciones en los comentarios, así que por favor léalas también. Gracias por la ayuda, amigos.
Aquí es:
Una función de reentrada puede ser llamada simultáneamente por múltiples hilos siempre que cada invocación de la función haga referencia a datos únicos.
Varios subprocesos pueden invocar simultáneamente una función de seguridad de subprocesos cuando cada invocación hace referencia a datos compartidos. Todo el acceso a los datos compartidos está serializado.
Desvergonzadamente robado del manual de Qt. Pero es una definición breve y concisa. Basicamente, una función no reentrante tampoco es recursion-safe
.
Ahora, ¿qué es una función recursive
? Es un tipo de definición de una función. La función recursiva se define en términos de sí mismos. Reducen la entrada, se autodenominan, hasta que se puede resolver un caso básico sin la necesidad de volver a llamarse a sí mismos.
Entonces tenemos dos cosas.
- las funciones recursivas son un tipo de definición.
- Las funciones de reentrada son funciones que garantizan que múltiples hilos pueden llamarlas, siempre que se acceda a datos únicos.
Ahora, el vehículo de múltiples hilos anterior solo sirve para tener múltiples activaciones de la función al mismo tiempo. Pero si tiene una función recursiva, también tiene múltiples activaciones de esas funciones al mismo tiempo. La mayoría de las funciones recursivas deben ser reentrantes también.
Todo el código de reentrantes es una recursión, pero no todas las recursiones son reentrantes. Ejemplo de recursión es cualquier función que se llame directa o indirectamente. Ejemplo de re-entant es, rutinas de controlador de interrupción.
Todos los códigos recursivos son reentrantes ... pero no todos los códigos reentrantes recursivos.
Una función Re entrant es una función que garantiza lo que puede funcionar bien en un entorno multihilo. Mientras que la función tiene acceso por un subproceso, otro subproceso puede llamarlo ... significa que hay una pila de ejecución y manejo separados para cada ... Así que la función no debe contener ninguna variable estática o compartida que pueda dañar o alterar la ejecución.
Función media que se puede llamar por hilo, mientras se ejecuta desde otro hilo de forma segura ... y correctamente ... espero haber respondido lo correcto ...
Y, por supuesto, la función de reentrada no es lo mismo que la función recursiva ... concepto totalmente diferente ... Una función Re entrante es una función que garantiza lo que puede funcionar bien en entornos de múltiples hilos. Mientras que la función tiene acceso por un subproceso, otro subproceso puede llamarlo ... significa que hay una pila de ejecución y manejo separados para cada ... Así que la función no debe contener ninguna variable estática o compartida que pueda dañar o alterar la ejecución.
significa que no debe contener ninguna variable estática o compartida ....
Función media que se puede llamar por hilo, mientras se ejecuta desde otro hilo de forma segura ... y correctamente ... espero haber respondido lo correcto ...
Y por supuesto, la función de reentrada no es lo mismo que la función recursiva ... concepto totalmente diferente ...
Leer más: http://wiki.answers.com/Q/What_is_a_reentrant_function#ixzz1wut38jLF Wiki: http://en.wikipedia.org/wiki/Reentrancy_%28computing%29