serait-il une déclaration vraie de dire que chaque fonction récursive doit être réentrante? P>
4 Réponses :
Pas du tout.
Pourquoi une fonction récursive ne devrait-elle pas avoir de données statiques, par exemple? Si ce n'est pas en mesure de verrouiller des sections critiques? P>
considérer: p> Cela ne va pas dire que la rédaction d'une fonction récursive et réentrante est facile. Neuf qu'il s'agit d'un modèle commun, ni que cela soit recommandé de quelque manière que ce soit. Mais c'est possible. P> p>
Pourquoi une fonction réentrante ne devrait-elle pas avoir de données statiques?
Daniel: C'est contre la définition: en.wikipedia.org/wiki/reentrant_%28SubRoutine%29 sauf si vous avez un autre.
Cette page est ridicule (vérifiez la page de discussion). Considérez les API pour accéder à un système de fichiers - ils accèdent aux données globales partagées et encore peuvent être appelées simultanément à partir de plusieurs threads / processus.
L'ajout d'un mutex ne fait pas que rétractable: un thread retourne le mauvais résultat, si un autre thread utilise toujours / à l'intérieur de la fonction.
Si un système de fichiers est le thread-coffre-fort car il utilise des verrous pour protéger les données statiques, c'est parce que ceux de ses sous-programmes qui accèdent des données statiques ne sont pas eux-mêmes réentrables (c'est pourquoi ils ont besoin de la protection).
Non, je me souviens d'une fonction factorielle qui fonctionne avec des variables statiques (globales). Avoir des variables statiques (globales) va à l'encontre d'être réentrant et toujours la fonction est récursive.
global i; factorial() { if i == 0 return 1; else { i = i -1; return i*factorial(); }
«réentrant» signifie normalement que la fonction peut être entrée plus d'une fois, simultanément, par deux threads différents. P>
être réentrant, il doit faire des choses comme protéger / verrouiller l'accès à l'état statique. P>
Une fonction récursive (d'autre part) n'a pas besoin de protéger / verrouiller l'accès à l'état statique, car il n'exécute qu'une déclaration à la fois. P>
SO: Non. P>
Il est possible d'avoir une fonction de fil-sécurité, mais pas non réentrante (même pour une application à une seule-filetage). En fait, il y a un exemple dans en.wikipedia.org/wiki/reentrancy_(computing)
Si par réentrant, vous voulez dire qu'un autre appel à la fonction peut commencer avant la fin d'une précédente terminée, alors oui, toutes les fonctions récursives sont réentrantes, car la récursivité implique la réentrance dans ce sens. P>
Cependant, "Reentrant" est parfois utilisé comme synonyme de "fil sûr", qui introduit beaucoup d'autres exigences et, en ce sens, la réponse est non. Dans la récursion à une seule fois filetée, nous avons le cas particulier que une seule "instance" de la fonction s'exécutera à la fois, car les instances "inactif" sur la pile attendent chacune de l'instance "enfant" de retourner. p>
Reentrant et le fil-coffre-fort ne sont pas la même chose: EN.Wikipedia.org/wiki/reentrant_ ( Subiltine)
"REtrance" a généralement une signification plus large que l'exécution précédente de la fonction peut être interrompue à à tout moment b> et dans cet état un nouvel appel à la même fonction peut être effectué. La nouvelle exécution de la fonction peut donc être induite par un événement asynchrone externe (interruption) à tout moment non seulement par un appel récursif ou un rappel prédéfini.
Retourné comme des devoirs possibles.
Pas de devoirs, juste une question que j'avais. Pas à l'école plus; au travail
Retraved: Récursion => Récursion