2010-07-13 6 views
7

Je suivais un re-entrancy guide sur les pratiques recommandées lors de l'écriture du code re-entrant.Pratiques recommandées pour le code re-entrant en C, C++

Quelles autres références et ressources couvrent ce sujet?

Quels outils semblables à des peluches peuvent être utilisés pour vérifier ces problèmes?

+0

ce guide a assez bien tout ce que vous devez savoir. Ce n'est pas une chose très subtile. N'utilisez pas de données que vous n'avez pas transmises dans l'appel de fonction, ne stockez aucun état dans la fonction. –

+1

Ce guide comporte de nombreuses erreurs, d'une définition de réentrance qui est en fait multithreading (bien que les exemples de traitement du signal soient de vraie réentrance) à un mauvais conseil (mutexes ... bonjour deadlock) à tout simplement bugginess ('sigsuspend (& zeromask)'. Vous avez juste autorisé le traitement des interruptions que votre appelant a désactivé pour une raison, essayez 'sigsuspend (& oldmask)' à la place). –

Répondre

0

Le guide est suffisant.

Ma règle personnelle de pouces ne sont que 2 pour le code re-reentering:

  1. prendre passent uniquement par des paramètres de valeur, utilisés uniquement valeur passée en tant que paramètres de la fonction. Si j'ai besoin d'utiliser des paramètres globaux ou un pointeur (pour des raisons de performances ou de stockage), utilisez un mutex ou un sémaphore pour contrôler l'accès à celui-ci.

+0

Si vous avez besoin de types complexes, rendez-les immuables si possible. – fmark

+0

Hi fmark: pouvez-vous nous en dire plus? Ou pointez-moi quelque chose en rapport avec cette déclaration? – ttchong

+8

non Non NON! Reentrancy! = Threading. Les mutex et sémaphores bloquent le code réentrant, ou bien échouent silencieusement à faire leur travail et laissent des données corrompues. –

1

Aucun vraiment. L'écriture de code non réentrant est généralement plus difficile que de ré-entrer. Il suffit de suivre ces directives simples et n'essayez pas de faire quelque chose de trop bizarre et tout ira bien.

Le code non réentrant est généralement écrit pour les problèmes de haute performance.

1
  • Utilisez-les variables locales.
  • N'utilisez pas de locals statiques ou de variables globales, même TLS ne vous aidera pas avec la récursivité/réentrée.
  • Restaurez tous vos invariants avant de faire des rappels.
  • Ne maintenez pas les verrous pendant les rappels. Si vous devez absolument (et j'irais toujours chercher un moyen de l'éviter) alors assurez-vous de savoir ce qui se passe si vous essayez de ressaisir votre serrure sur le fil qui le contient déjà. Au minimum, vous devez tester pour cela, sinon, en fonction de la serrure, vous obtiendrez des blocages ou des invariants brisés (c'est-à-dire une corruption).
0
  1. Une fonction rentrante ne peut pas utiliser des variables d'une manière non atomique à moins qu'ils ne sont stockés sur la pile de la tâche d'appel ou sont les variables privées de cette tâche.
  2. Une fonction réentrante ne peut pas appeler d'autres fonctions qui ne sont pas réentrantes.
  3. Une fonction réentrante ne peut pas utiliser le matériel de manière non atomique.

Ref: page 462 [INTRODUCTION UTILISATION DU RENESAS RX62N MICROCONTRÔLEUR] [James M. Conrad]