Freigeben über


Interlocked Variable Access

Anwendungen müssen den Zugriff auf Variablen synchronisieren, die von mehreren Threads gemeinsam genutzt werden. Anwendungen müssen auch sicherstellen, dass Vorgänge an diesen Variablen atomar durchgeführt werden (in ihrer Gesamtheit oder gar nicht.)

Einfache Lese- und Schreibvorgänge in ordnungsgemäß ausgerichtete 32-Bit-Variablen sind Atomoperationen. Mit anderen Worten, Sie werden nicht enden, wenn nur ein Teil der Variablen aktualisiert wird; alle Bits werden in atomer Weise aktualisiert. Der Zugriff wird jedoch nicht garantiert synchronisiert. Wenn zwei Threads aus derselben Variablen gelesen und geschrieben werden, können Sie nicht ermitteln, ob ein Thread den Lesevorgang ausführt, bevor der andere den Schreibvorgang ausführt.

Einfache Lese- und Schreibvorgänge, um ordnungsgemäß ausgerichtete 64-Bit-Variablen zu verwenden, sind atomar auf 64-Bit-Windows. Lese- und Schreibvorgänge in 64-Bit-Werte sind nicht garantiert atomig unter 32-Bit-Windows. Lese- und Schreibvorgänge in Variablen anderer Größen sind auf keiner Plattform nicht garantiert atom.

Die verriegelte 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 auf atomare Weise für Variablen aus. Die Threads verschiedener Prozesse können diese Funktionen verwenden, wenn sich die Variable im gemeinsam genutzten Speicher befindet.

Die InterlockedIncrement und InterlockedDecrement- Funktionen kombinieren die Schritte, die bei der Erhöhung oder Dekrementierung einer Variablen in einen atomischen Vorgang involviert sind. Dieses Feature ist in einem Multitasking-Betriebssystem nützlich, in dem das System die Ausführung eines Threads unterbrechen kann, um einem anderen Thread eine Prozessorzeit zu gewähren. Ohne eine solche Synchronisierung konnten zwei Threads denselben Wert lesen, es um 1 erhöhen und den neuen Wert für eine Gesamterhöhung von 1 anstelle von 2 speichern. Die verriegelten Funktionen für den variablen Zugriff schützen diese Art von Fehler.

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

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

Die InterlockedAnd, InterlockedOrund InterlockedXor funktionen atomar UND- oder XOR-Vorgänge ausführen.

Es gibt Funktionen, die speziell für die Ausführung des verriegelten Variablenzugriffs auf 64-Bit-Speicherwerte und -Adressen ausgelegt 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 verriegelten Funktionen bieten vollständige Speicherbarrieren auf allen Windows-Plattformen. Es gibt auch Funktionen, die die grundlegenden interlockierten Variablenzugriffsvorgänge mit der Von bestimmten Prozessoren unterstützten Speicherordnungssemantik kombinieren und freigeben. Jede dieser Funktionen enthält das Wort "Erwerben" oder "Freigeben" in ihren Namen; beispiel: InterlockedDecrementAcquire und InterlockedDecrementRelease. Abrufen der Speichersemantik gibt an, dass der vom aktuellen Thread ausgeführte Speichervorgang sichtbar ist, bevor andere Speichervorgänge versucht werden. Release memory semantics specify that the memory operation being perform by the current thread will be visible after all other memory operations have been completed. Mit diesen Semantiken können Sie erzwingen, dass Speichervorgänge in einer bestimmten Reihenfolge ausgeführt werden. Verwenden Sie beim Eingeben eines geschützten Bereichs Semantik, und geben Sie semantische Semantik frei, wenn Sie ihn verlassen.

systeminternen Compiler-

Synchronisierungs- und Multiprozessorprobleme