Freigeben über


Hinzufügen einer Anmerkung zum Sperrverhalten

Um Parallelitätsfehler in einem Multithreadprogramm zu vermeiden, führen Sie immer eine geeignete Sperrendisziplin und verwenden Sie SAL-Anmerkungen.

Parallelitätsfehler sind sich schwierig zu reproduzieren, zu ermitteln und zu debuggen, da sie nicht deterministisch sind.Die Schlussfolgerungen über das Threadverschachteln ist bestenfalls schwierig, und wird ausgeführt, wenn Sie einen Codeabschnitt, der mehr verfügt, als mehrere Threads entwerfen.Daher ist es empfehlenswert, einer Sperrendisziplin in den sechs Programmen zu folgen.Beispielsweise eine Sperre befolgend sortieren Sie beim Abrufen mehrerer Sperren, die die Deadlocks vermeiden, und die richtige Schützensperre, bevor Sie die auf eine freigegebene Ressource zugreifen, Abrufen verhindern Sie Racebedingungen.

Leider können scheinbar einfache Sperrenregeln überraschend schwierig werden, in der Praxis folgen.Eine grundlegende Einschränkung in den heutigen Programmiersprachen und den Compilern ist, dass sie nicht direkt die Spezifikation und die Analyse von Parallelitätsanforderungen unterstützen.Programmierer müssen auf informellen Codekommentare verlassen, um auszudrücken ihre Absichten darüber, wie sie Sperren verwenden.

Parallelität SAL-Anmerkungen wurden entwickelt, die Ihnen helfen, Sperrennebeneffekte, Sperrenverantwortung, Datenschutz, Sperrenreihenfolgenhierarchie und andere erwartetes Sperrverhalten anzugeben.Durch die implizite Regeln explizit einrichten, stellen SALZparallelitätsanmerkungen eine konsistente Möglichkeit, damit Sie dokumentieren, wie der Code Sperrenregeln verwendet.Parallelitätsanmerkungen erhöhen auch die Fähigkeit von Codeanalysetools, Racebedingungen, Deadlocks, nicht übereinstimmende Synchronisierungsoperationen und andere feine Parallelitätsfehler zu suchen.

Allgemeine Richtlinien

Mit Anmerkungen verwenden, können Sie die Verträge berücksichtigen, die von Funktionsdefinitionen zwischen Implementierungen (Aufgerufenen) und Clients (Aufrufer) bedeutet werden, und drücken invariante Elemente und andere Eigenschaften des Programms aus, das Analyse weiter verbessern kann.

SAL unterstützt viele verschiedene Arten von Sperre Primitive – z. B. kritischen Abschnitten, Mutexe, Spinlocks und andere Ressourcen.Viele Parallelitätsanmerkungen akzeptieren einen Sperrenausdruck als Parameter.Standardmäßig wird eine Sperre durch den Pfadausdruck des zugrunde liegenden Sperrenobjekts gekennzeichnet.

Einige Thread- Besitzregeln zu beachten:

  • Spinlocks sind uncounted Sperren, die klare Threadbesitz haben.

  • Mutexe und kritische Abschnitte sind gezählte Sperren, die klare Threadbesitz haben.

  • Semaphore und Ereignisse sind gezählte Sperren, die nicht klaren Threadbesitz haben.

Sperren-Anmerkungen

In der folgenden Tabelle werden die Sperrenanmerkungen auf.

Anmerkung

Beschreibung

_Acquires_exclusive_lock_(expr)

Kommentiert eine Funktion und gibt das im Nachbedingung die Funktionsinkremente durch eines die exklusive Sperrenanzahl des Sperrenobjekts an, das durch expr genannt wird.

_Acquires_lock_(expr)

Kommentiert eine Funktion und gibt das im Nachbedingung die Funktionsinkremente durch eines die Sperrenanzahl des Sperrenobjekts an, das durch expr genannt wird.

_Acquires_nonreentrant_lock_(expr)

Die Sperre, die von expr genannt wird, wird abgerufen.Ein Fehler wird ausgegeben, wenn die Sperre bereits angehalten wird.

_Acquires_shared_lock_(expr)

Kommentiert eine Funktion und gibt das im Nachbedingung die Funktionsinkremente durch eines die Anzahl der gemeinsamen Sperre des Sperrenobjekts an, das durch expr genannt wird.

_Create_lock_level_(name)

Eine - Anweisung, die das Symbol name deklariert, um eine Sperrenebene zu sein, damit sie in den Anmerkungen _Has_Lock_level_ und _Lock_level_order_ verwendet werden kann.

_Has_lock_kind_(kind)

Kommentiert jedes Objekt, um die Typinformationen eines Ressourcenobjekts zu verfeinern.Manchmal ist ein allgemeiner Typ für verschiedene Arten von Ressourcen verwendet und der überladene Typ ist nicht ausreichend, die semantischen Anforderungen unter verschiedenen Ressourcen zu unterscheiden.Im Folgenden finden Sie eine Liste von vordefinierten kind-Parametern:

_Lock_kind_mutex_

Sperre interessante ID für Mutexe.

_Lock_kind_event_

Sperre interessante ID für Ereignisse.

_Lock_kind_semaphore_

Sperre interessante ID für Semaphore.

_Lock_kind_spin_lock_

Sperre interessante ID für Spinlocks.

_Lock_kind_critical_section_

Sperre interessante ID für kritische Abschnitte.

_Has_lock_level_(name)

Kommentiert ein - Objekt und gibt dieser die Sperre, die von name einstellen.

_Lock_level_order_(name1, name2)

Eine - Anweisung, die die Sperrenreihenfolge zwischen name1 und name2 gibt.

_Post_same_lock_(expr1, expr2)

Kommentiert eine Funktion und gibt das im Nachbedingung die zwei Sperren, expr1 an und expr2, werden behandelt, als ob sie das gleiche - Objekt sind.

_Releases_exclusive_lock_(expr)

Kommentiert eine Funktion und gibt das im Nachbedingung die Funktionsdekremente durch eines die exklusive Sperrenanzahl des Sperrenobjekts an, das durch expr genannt wird.

_Releases_lock_(expr)

Kommentiert eine Funktion und gibt das im Nachbedingung die Funktionsdekremente durch eines die Sperrenanzahl des Sperrenobjekts an, das durch expr genannt wird.

_Releases_nonreentrant_lock_(expr)

Die Sperre, die von expr genannt wird, ist freigegeben.Ein Fehler wird ausgegeben, wenn die Sperre nicht nur angehalten wird.

_Releases_shared_lock_(expr)

Kommentiert eine Funktion und gibt das im Nachbedingung die Funktionsdekremente durch eines die Anzahl der gemeinsamen Sperre des Sperrenobjekts an, das durch expr genannt wird.

_Requires_lock_held_(expr)

Kommentiert eine Funktion und gibt das in angeben vor die Sperrenanzahl des Objekts an, das durch expr ist mindestens eines genannt wird.

_Requires_lock_not_held_(expr)

Kommentiert eine Funktion und gibt das in angeben vor die Sperrenanzahl des Objekts an, das durch expr ist null genannt wird.

_Requires_no_locks_held_

Kommentiert eine Funktion und gibt an, dass die Sperrenanzahlen aller Sperren, die dem Prüfer bekannt, gleich sind.

_Requires_shared_lock_held_(expr)

Kommentiert eine Funktion und gibt das in angeben vor die Anzahl der gemeinsamen Sperre des Objekts an, das durch expr ist mindestens eines genannt wird.

_Requires_exclusive_lock_held_(expr)

Kommentiert eine Funktion und gibt das in angeben vor die exklusive Sperrenanzahl des Objekts an, das durch expr ist mindestens eines genannt wird.

SAL systeminterne Funktionen für nicht verfügbar gemachte Sperren-Objekte

Bestimmte Sperrenobjekte werden nicht durch die Implementierung der zugeordneten Sperrenfunktionen verfügbar gemacht.In der folgenden Tabelle werden systeminterne Variablen des SALZES auf, die Anmerkungen auf Funktionen aktivieren, die an diese nicht verfügbar gemachte Sperrenobjekte ausführen.

Anmerkung

Beschreibung

_Global_cancel_spin_lock_

Beschreibt den Löschenspinlock.

_Global_critical_region_

Beschreibt den kritischen Bereich.

_Global_interlock_

Beschreibt Suche Vorgänge überschneiden.

_Global_priority_region_

Beschreibt den Prioritätsbereich.

Freigegebene Datenzugriffs-Anmerkungen

In der folgenden Tabelle sind die Anmerkungen für freigegebenen Datenzugriff auf.

Anmerkung

Beschreibung

_Guarded_by_(expr)

Kommentiert eine Variable und gibt an, dass, wenn auf die Variable zugegriffen wird, die Sperrenanzahl des Sperrenobjekts, das von expr genannt wird, mindestens eines ist.

_Interlocked_

Kommentiert eine Variable und ist für _Guarded_by_(_Global_interlock_) entsprechend.

_Interlocked_operand_

Der Funktionsparameter mit Anmerkungen ist der Zieloperand von einer der verschiedenen ineinandergegriffenen Funktionen.Diese Operanden müssen bestimmte zusätzliche Eigenschaften haben.

_Write_guarded_by_(expr)

Kommentiert eine Variable und gibt an, dass, wenn die Variable geändert wird, die Sperrenanzahl des Sperrenobjekts, das von expr genannt wird, mindestens eines ist.

Siehe auch

Referenz

Hinzufügen einer Anmerkung zu Funktionsparametern und Rückgabewerten

Hinzufügen einer Anmerkung zum Funktionsverhalten

Hinzufügen einer Anmerkung zu Strukturen und Klassen

Angeben, wann und wo eine Anmerkung gültig ist

Systeminterne Funktionen

Empfohlene Vorgehensweisen und Beispiele (SAL)

Konzepte

Einführung in SAL

Weitere Ressourcen

Verwenden von SAL-Anmerkungen zum Reduzieren von C/C++-Codefehlern

Codeanalyse-Team-Blog