Namensräume
Varianten
Aktionen

atomic_compare_exchange_weak, atomic_compare_exchange_strong, atomic_compare_exchange_weak_explicit, atomic_compare_exchange_strong_explicit

Von cppreference.com
< c‎ | atomar
Definiert im Header <stdatomic.h>
_Bool atomic_compare_exchange_strong( volatile A* obj,
                                      C* expected, C desired );
(1) (seit C11)
_Bool atomic_compare_exchange_weak( volatile A *obj,
                                    C* expected, C desired );
(2) (seit C11)
_Bool atomic_compare_exchange_strong_explicit( volatile A* obj,

                                               C* expected, C desired,
                                               memory_order succ,

                                               memory_order fail );
(3) (seit C11)
_Bool atomic_compare_exchange_weak_explicit( volatile A *obj,

                                             C* expected, C desired,
                                             memory_order succ,

                                             memory_order fail );
(4) (seit C11)

Atomar vergleicht den Inhalt des Speichers, auf den von obj gezeigt wird, mit dem Inhalt des Speichers, auf den von expected gezeigt wird, und wenn diese bitweise gleich sind, ersetzt er den ersteren durch desired (führt eine Lese-Änderungs-Schreib-Operation durch). Andernfalls lädt er den tatsächlichen Inhalt des Speichers, auf den von obj gezeigt wird, in *expected (führt eine Ladeoperation durch).

Die Speichermodelle für die Lese-Änderungs-Schreib- und die Ladeoperationen sind succ bzw. fail. Die Versionen (1-2) verwenden standardmäßig memory_order_seq_cst.

Die schwachen Formen ((2) und (4)) der Funktionen dürfen fehlschlagen (spuriously), d. h. so wirken, als ob *obj != *expected wäre, auch wenn sie gleich sind. Wenn ein Vergleiche und Austauschen in einer Schleife stattfindet, wird die schwache Version auf einigen Plattformen eine bessere Leistung erzielen. Wenn ein schwacher Vergleiche und Austauschen eine Schleife erfordern würde und ein starker nicht, ist der starke vorzuziehen.

Dies ist eine generische Funktion, die für alle atomaren Objekttypen A definiert ist. Das Argument ist ein Zeiger auf einen volatilen atomaren Typ, um Adressen von sowohl nicht-volatilen als auch volatilen (z. B. speicherprogrammierten I/O) atomaren Objekten zu akzeptieren, und die volatile Semantik wird bei Anwendung dieser Operation auf volatile atomare Objekte beibehalten. C ist der nicht-atomare Typ, der A entspricht.

Es ist nicht spezifiziert, ob der Name einer generischen Funktion ein Makro oder ein mit externem Linkage deklariertes Bezeichner ist. Wenn eine Makrodefinition unterdrückt wird, um auf eine tatsächliche Funktion zuzugreifen (z. B. in Klammern wie (atomic_compare_exchange)(...)) oder ein Programm einen externen Bezeichner mit dem Namen einer generischen Funktion definiert, ist das Verhalten undefiniert.

Inhalt

[edit] Parameter

obj - Zeiger auf das atomare Objekt, das getestet und geändert werden soll
expected - Zeiger auf den Wert, der im atomaren Objekt erwartet wird
desired - der Wert, der in das atomare Objekt geschrieben werden soll, wenn er wie erwartet ist
succ - die Speichergalaxysynchronisationsordnung für die Lese-Änderungs-Schreib-Operation, wenn der Vergleich erfolgreich ist. Alle Werte sind zulässig.
fail - die Speichergalaxysynchronisationsordnung für die Ladeoperation, wenn der Vergleich fehlschlägt. Kann nicht memory_order_release oder memory_order_acq_rel sein und kann keine stärkere Ordnung als succ angeben

[edit] Rückgabewert

Das Ergebnis des Vergleichs: true, wenn *obj gleich *exp war, false andernfalls.

[edit] Hinweise

Das Verhalten der Familie atomic_compare_exchange_* ist so, als wäre Folgendes atomar ausgeführt worden

if (memcmp(obj, expected, sizeof *obj) == 0) {
    memcpy(obj, &desired, sizeof *obj);
    return true;
} else {
    memcpy(expected, obj, sizeof *obj);
    return false;
}

[edit] Referenzen

  • C17-Standard (ISO/IEC 9899:2018)
  • 7.17.7.4 Die generischen Funktionen atomic_compare_exchange (S. 207)
  • C11-Standard (ISO/IEC 9899:2011)
  • 7.17.7.4 Die generischen Funktionen atomic_compare_exchange (S. 283-284)

[edit] Siehe auch

tauscht einen Wert mit dem Wert eines atomaren Objekts aus
(Funktion) [bearbeiten]
C++ Dokumentation für atomic_compare_exchange_weak, atomic_compare_exchange_strong, atomic_compare_exchange_weak_explicit, atomic_compare_exchange_strong_explicit