std::atomic_ref<T>::compare_exchange_weak, std::atomic_ref<T>::compare_exchange_strong
bool compare_exchange_weak ( value_type& expected, value_type desired, |
(1) | (constexpr seit C++26) |
bool compare_exchange_weak ( value_type& expected, value_type desired, |
(2) | (constexpr seit C++26) |
bool compare_exchange_strong ( value_type& expected, value_type desired, |
(3) | (constexpr seit C++26) |
bool compare_exchange_strong ( value_type& expected, value_type desired, |
(4) | (constexpr seit C++26) |
Vergleicht atomar die Wertdarstellung des referenzierten Objekts mit der von expected und, falls diese bitweise gleich sind, ersetzt ersteres durch desired (führt eine Lese-Modifikations-Schreib-Operation durch). Andernfalls lädt sie den tatsächlich im referenzierten Objekt gespeicherten Wert in expected (führt eine Lese-Operation durch).
Diese Überladungen nehmen nur an der Überladungsauflösung teil, wenn std::is_const_v<T> false ist.
Wenn failure nicht std::memory_order_relaxed, std::memory_order_consume, std::memory_order_acquire oder std::memory_order_seq_cst ist, ist das Verhalten undefiniert.
Inhalt |
[bearbeiten] Parameter
| expected | - | Referenz auf den Wert, der im von atomic_ref referenzierten Objekt erwartet wird. |
| desired | - | Der Wert, der im referenzierten Objekt gespeichert werden soll, wenn er wie erwartet ist. |
| erfolgreich | - | die Speicher-Synchronisationsreihenfolge für die Lese-Änderungs-Schreib-Operation, wenn der Vergleich erfolgreich ist |
| failure | - | die Speicher-Synchronisationsreihenfolge für die Ladeoperation, wenn der Vergleich fehlschlägt |
| Reihenfolge | - | die Speicher-Synchronisationsreihenfolge für beide Operationen |
[bearbeiten] Rückgabewert
true, wenn das referenzierte Objekt erfolgreich geändert wurde, andernfalls false.
[bearbeiten] Hinweise
Der Vergleich und das Kopieren erfolgen bitweise (ähnlich wie bei std::memcmp und std::memcpy); es werden keine Konstruktoren, Zuweisungsoperatoren oder Vergleichsoperatoren verwendet.
Die schwachen Formen (1,2) der Funktionen dürfen fehlschlagen, d.h. sie können sich so verhalten, als wäre *this != expected, auch wenn sie gleich sind. Wenn ein Vergleich-und-Austausch in einer Schleife verwendet wird, erzielt die schwache Version auf einigen Plattformen eine bessere Leistung.
Wenn ein schwacher Vergleich-und-Austausch eine Schleife erfordert und ein starker nicht, ist der starke vorzuziehen, es sei denn, die Wertdarstellung von value_type kann Trap-Bits enthalten oder bietet mehrere Wertdarstellungen für denselben Wert (z. B. Gleitkomma-NaN). In diesen Fällen funktioniert ein schwacher Vergleich-und-Austausch typischerweise, da er schnell zu einer stabilen Wertdarstellung konvergiert.
Für eine Union mit Bits, die an den Wertrepräsentationen einiger Member, aber nicht der anderen teilnehmen, kann ein Compare-and-Exchange immer fehlschlagen, da solche Auffüllbits undefinierte Werte haben, wenn sie nicht an der Wertrepräsentation des aktiven Members teilnehmen.
Auffüllbits, die niemals an der Wertrepräsentation eines Objekts teilnehmen, werden ignoriert.
[bearbeiten] Meldungen zu Fehlern
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 3508 (P3323R1) |
C++20 | compare_exchange_weak und compare_exchange_strongwaren bedeutungslos für const T |
constrained to accept only non-const T |
[bearbeiten] Beispiel
| Dieser Abschnitt ist unvollständig Grund: kein Beispiel |