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:
|
_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
Empfohlene Vorgehensweisen und Beispiele (SAL)
Konzepte
Weitere Ressourcen
Verwenden von SAL-Anmerkungen zum Reduzieren von C/C++-Codefehlern