Freigeben über


Hinzufügen einer Anmerkung zum Sperrverhalten

Um Parallelitätsfehler in einem Multithreadprogramm zu vermeiden, immer nach einer entsprechenden Sperrendisziplin und verwenden Sie SAL-Anmerkungen.

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

Leider können scheinbar einfache Sperrenregeln überraschend schwer, in der Praxis zu folgen.Eine grundlegende Einschränkung in den heutigen Programmiersprachen und Compiler ist, dass sie nicht direkt die Spezifikation und die Analyse von Nebenläufigkeitsanforderungen 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 entworfen, um Ihnen helfen, Sperrennebeneffekten, Sperrenverantwortung, Data Protection, Sperrenreihenfolgenhierarchie und anderem erwartetem Sperrverhalten anzugeben.Indem implizite Regeln explizit aufstellen, stellen SALZnebenläufigkeitsanmerkungen eine konsistente Navigationsmöglichkeit zur Verfügung, sodass Sie dokumentieren, wie der Code Sperrenregeln verwendet.Nebenläufigkeitsanmerkungen erhöhen auch die Möglichkeit von Codeanalysetools, Racebedingungen, Deadlocks, nicht übereinstimmende Synchronisierungsoperationen und andere kleinere Parallelitätsfehler zu suchen.

Allgemeine Richtlinien

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

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

Einige Anwendungen Besitzregeln zu beachten:

  • Spinlocks sind uncounted Sperren, die dabei Threadbesitz haben.

  • Mutexe und kritischen Abschnitten sind gezählte Sperren, die dabei Threadbesitz haben.

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

Sperren von Anmerkungen

Die folgende Tabelle zeigt die Sperrenanmerkungen auf.

Anmerkung

Beschreibung

_Acquires_exclusive_lock_(expr)

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

_Acquires_lock_(expr)

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

_Acquires_nonreentrant_lock_(expr)

Die Sperre, die durch expr, abgerufen wird. Ein Fehler wird ausgegeben, wenn die Sperre noch angehalten wird.

_Acquires_shared_lock_(expr)

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

_Create_lock_level_(name)

Eine Anweisung, die das Symbol name deklariert, um eine Sperrenebene 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 optimieren.Manchmal ist ein allgemeiner Typ für unterschiedliche Arten von Ressourcen verwendet und der überladene Typ befindet nicht ausreichend, die Semantik- Anforderungen unter verschiedenen Ressourcen zu unterscheiden.Im Folgenden eine Liste vordefinierter kind-Parametern:

_Lock_kind_mutex_

Sperre interessante ID für Mutexe einrichten.

_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 Sperrenobjekt und gibt es die Sperre, die von name ausgeführt wird.

_Lock_level_order_(name1, name2)

Eine Anweisung, die die Sperrenreihenfolge zwischen name1 und name2 besteht.

_Post_same_lock_(expr1, expr2)

Kommentiert eine Funktion und gibt das im Nachbedingung die zwei Sperren, expr1 und expr2, werden behandelt, als ob sie auf dasselbe Sperrenobjekt sind.

_Releases_exclusive_lock_(expr)

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

_Releases_lock_(expr)

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

_Releases_nonreentrant_lock_(expr)

Die Sperre, die von expr, sind freigegeben.Ein Fehler wird ausgegeben, wenn die Sperre nicht nur unterbrochen wird.

_Releases_shared_lock_(expr)

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

_Requires_lock_held_(expr)

Kommentiert eine Funktion und verleiht dem Einchecken angeben vor die Sperrenanzahl des Objekts an, das von expr ist mindestens eines mit dem Namen.

_Requires_lock_not_held_(expr)

Kommentiert eine Funktion und verleiht dem Einchecken angeben vor die Sperrenanzahl des Objekts an, das von expr ist null ".

_Requires_no_locks_held_

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

_Requires_shared_lock_held_(expr)

Kommentiert eine Funktion und verleiht dem Einchecken angeben vor die Anzahl des gemeinsamen Sperre des Objekts an, das von expr ist mindestens eines mit dem Namen.

_Requires_exclusive_lock_held_(expr)

Kommentiert eine Funktion und verleiht dem Einchecken angeben vor die exklusive Sperrenanzahl des Objekts an, das von expr ist mindestens eines mit dem Namen.

Systeminterne SAL-Funktionen für nicht verfügbare Sperrobjekte

Bestimmte Sperrenobjekte werden nicht von der Implementierung der zugeordneten Sperrenfunktionen verfügbar gemacht. Die folgende Tabelle zeigt systeminterne Variablen des SALZES auf, die Anmerkungen auf Funktionen aktivieren, die an diese nicht verfügbar gemachten Sperrenobjekte ausführen.

Anmerkung

Beschreibung

_Global_cancel_spin_lock_

Beschreibt den Löschenspinlock.

_Global_critical_region_

Beschreibt den kritischen Bereich.

_Global_interlock_

Beschreibt kann Vorgänge Netz.

_Global_priority_region_

Beschreibt den Prioritätsbereich.

Anmerkungen zum freigegebenen Datenzugriff

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, mindestens eines ist.

_Interlocked_

Kommentiert eine Variable und entspricht _Guarded_by_(_Global_interlock_).

_Interlocked_operand_

Der Funktionsparameter mit Anmerkungen ist der Zieloperand 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 Variablen geändert wird, die Sperrenanzahl des Sperrenobjekts, das von expr, 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