2010-07-13 9 views
7

Ich habe eine re-entrancy guide über empfohlene Praktiken beim Schreiben von Reentry-Code durchgespielt.Empfohlene Vorgehensweisen für Wiedereintrittscode in C, C++

Welche anderen Referenzen und Ressourcen decken dieses Thema ab?

Welche fusselartigen Werkzeuge können verwendet werden, um nach diesen Problemen zu suchen?

+0

, dass so ziemlich Führung hat alles, was Sie wissen müssen. Es ist keine sehr subtile Sache. Verwenden Sie keine Daten, die Sie beim Funktionsaufruf nicht übergeben haben, speichern Sie keine Zustände in der Funktion. –

+1

Dieser Leitfaden hat zahlreiche Fehler, von einer Definition der Reentrancy, die tatsächlich Multithreading ist (obwohl die Signalverarbeitungsbeispiele echte Reentrancy sind), zu schlechten Ratschlägen (Mutexe ... Hallo Deadlock) zu einfachem Bugginess ('sigsuspend (& zeromask)'). Sie haben gerade die Verarbeitung von Interrupts zugelassen, die Ihr Aufrufer aus einem bestimmten Grund deaktiviert hat, und versuchen stattdessen "sigsuspend (& oldmask)". –

Antwort

0

Die Anleitung ist ausreichend.

Meine persönliche Regel von Daumen sind nur 2 für die Wieder reentering Code:

  1. nur von Wert Parameter übergeben nehmen, verwendet nur Wert als Parameter in der Funktion übergeben.

  2. Wenn ich irgendwelche globalen Parameter oder Zeiger (für Leistung oder Speicherung) verwenden muss, verwenden Sie einen Mutex oder Semaphor, um den Zugriff darauf zu steuern.

+0

Wenn Sie komplexe Typen benötigen, machen Sie sie möglichst unveränderlich – fmark

+0

Hallo Fmark: Können Sie eine weitere erklären? Oder weisen Sie mich auf etwas in Bezug auf diese Aussage? – ttchong

+8

nein Nein NEIN! Reentrancy! = Threading. Mutexe und Semaphore blockieren den Code für den Wiedereintritt in die Datenbank, oder sie können ihre Arbeit stillschweigend verrichten und die Daten korrumpieren lassen. –

1

Keine wirklich. Das Schreiben von nicht wiedereintretendem Code ist normalerweise schwieriger als das erneute Eingeben. Befolgen Sie einfach diese einfachen Richtlinien und versuchen Sie nicht, etwas zu watscheln und Ihnen wird es gut gehen.

Nicht wiederkehrender Code wird normalerweise für Hochleistungsprobleme geschrieben.

1
  • Sie lokale Variablen verwenden.
  • Verwenden Sie keine statischen Locals oder globalen Variablen, auch TLS wird Ihnen nicht bei Rekursion/Reentrancy helfen.
  • Stellen Sie alle Invarianten wieder her, bevor Sie Rückrufe ausführen.
  • Halten Sie keine Sperren, während Sie Rückrufe ausführen. Wenn Sie absolut müssen (und ich würde immer noch nach einem Weg suchen, um es zu vermeiden), dann stellen Sie sicher, dass Sie wissen, was passiert, wenn Sie versuchen, Ihre Sperre für den Thread erneut eingeben, der es bereits hält. Zumindest müssen Sie dies testen, da Sie andernfalls Deadlocks oder defekte Invarianten (d. H. Korruption) erhalten.
0
  1. A Reentry-Funktion Variablen kann nicht in eine nicht-atomaren Weise verwenden, sofern sie nicht auf dem Stack des aufrufenden Task gespeichert sind oder sind die privaten Variablen dieser Aufgabe.
  2. Eine Wiedereintrittsfunktion darf keine anderen Funktionen aufrufen, die nicht reentrant sind.
  3. Eine Wiedereintrittsfunktion darf die Hardware nicht auf atomare Weise verwenden.

Ref: Seite 462 [EINFÜHRUNG VERWENDUNG DER RENESAS RX62N MIKROCONTROLLER] [James M. Conrad]