Zugriff auf verriegelte Variablen

Anwendungen müssen den Zugriff auf Variablen synchronisieren, die von mehreren Threads gemeinsam genutzt werden. Anwendungen müssen auch sicherstellen, dass Vorgänge für diese Variablen atomar ausgeführt werden (vollständig oder gar nicht ausgeführt werden.)

Einfache Lese- und Schreibvorgänge für richtig ausgerichtete 32-Bit-Variablen sind atomare Vorgänge. Mit anderen Worten: Sie werden nicht nur einen Teil der Variablen aktualisiert. Alle Bits werden auf atomare Weise aktualisiert. Es ist jedoch nicht garantiert, dass der Zugriff synchronisiert wird. Wenn zwei Threads aus derselben Variablen lesen und schreiben, können Sie nicht ermitteln, ob ein Thread seinen Lesevorgang ausführt, bevor der andere den Schreibvorgang ausführt.

Einfache Lese- und Schreibvorgänge für ordnungsgemäß ausgerichtete 64-Bit-Variablen sind unter 64-Bit-Windows atomar. Lese- und Schreibvorgänge in 64-Bit-Werte sind unter 32-Bit-Windows nicht garantiert atomisch. Lese- und Schreibvorgänge in Variablen anderer Größen sind auf keiner Plattform garantiert atomisch.

Die interlocked API

Die verriegelten Funktionen bieten einen einfachen Mechanismus zum Synchronisieren des Zugriffs auf eine Variable, die von mehreren Threads gemeinsam genutzt wird. Sie führen auch Vorgänge für Variablen auf atomare Weise aus. Die Threads verschiedener Prozesse können diese Funktionen verwenden, wenn sich die Variable im freigegebenen Arbeitsspeicher befindet.

Die Funktionen InterlockedIncrement und InterlockedDecrement kombinieren die Schritte, die beim Erhöhen oder Dekrementieren einer Variablen zu einem atomaren Vorgang erforderlich sind. Dieses Feature ist nützlich in einem Multitasking-Betriebssystem, bei dem das System die Ausführung eines Threads unterbrechen kann, um einem anderen Thread einen Teil der Prozessorzeit zu gewähren. Ohne eine solche Synchronisierung könnten zwei Threads denselben Wert lesen, ihn um 1 erhöhen und den neuen Wert für eine Gesamterhöhung von 1 statt 2 speichern. Die verriegelten Variablenzugriffsfunktionen schützen vor dieser Art von Fehler.

Die Funktionen InterlockedExchange und InterlockedExchangePointer tauschen die Werte der angegebenen Variablen atomar aus. Die InterlockedExchangeAdd-Funktion kombiniert zwei Vorgänge: Das Hinzufügen von zwei Variablen und das Speichern des Ergebnisses in einer der Variablen.

Die Funktionen InterlockedCompareExchange, InterlockedCompare64Exchange128 und InterlockedCompareExchangePointer kombinieren zwei Vorgänge: vergleichen zwei Werte und speichern einen dritten Wert in einer der Variablen, basierend auf dem Ergebnis des Vergleichs.

Die Funktionen InterlockedAnd, InterlockedOr und InterlockedXor führen atomar AND-, OR- und XOR-Vorgänge aus.

Es gibt Funktionen, die speziell für die Ausführung des ineinandergreifenden Variablenzugriffs auf 64-Bit-Speicherwerte und -Adressen konzipiert sind und für die Verwendung unter 64-Bit-Windows optimiert sind. Jede dieser Funktionen enthält "64" im Namen; Beispiel : InterlockedDecrement64 und InterlockedCompareExchangeAcquire64.

Die meisten ineinandergreifenden Funktionen bieten vollständige Speicherbarrieren auf allen Windows-Plattformen. Es gibt auch Funktionen, die die grundlegenden Intaktierungszugriffsvorgänge für Variablen mit der Semantik zum Abrufen und Freigeben von Speicherreihenfolgen kombinieren, die von bestimmten Prozessoren unterstützt werden. Jede dieser Funktionen enthält das Wort "Acquire" oder "Release" in ihren Namen; Beispiel : InterlockedDecrementAcquire und InterlockedDecrementRelease. Speichersemantik abrufen gibt an, dass der vom aktuellen Thread ausgeführte Speichervorgang sichtbar ist, bevor andere Speichervorgänge versucht werden. Freigabespeichersemantik gibt an, dass der Vom aktuellen Thread ausgeführte Speichervorgang sichtbar ist, nachdem alle anderen Speichervorgänge abgeschlossen wurden. Mit dieser Semantik können Sie erzwingen, dass Speichervorgänge in einer bestimmten Reihenfolge ausgeführt werden. Verwenden Sie beim Eingeben einer geschützten Region die Acquire-Semantik, und geben Sie semantik frei, wenn Sie sie verlassen.

Intrinsische Compilerfunktionen

Synchronisierungs- und Multiprozessorprobleme