std::atomic_ref
| Definiert in Header <atomic> |
||
| template< class T > struct atomic_ref; |
(seit C++20) | |
Die Klassenvorlage std::atomic_ref wendet atomare Operationen auf das Objekt an, auf das sie verweist.
Für die Lebensdauer des std::atomic_ref-Objekts gilt das referenzierte Objekt als atomares Objekt. Wenn ein Thread in ein atomares Objekt schreibt, während ein anderer Thread daraus liest, ist das Verhalten wohldefiniert (siehe Speichermodell für Details zu Datenrennen). Zusätzlich können Zugriffe auf atomare Objekte zwischen-Thread-Synchronisation herstellen und nicht-atomare Speicherzugriffe gemäß std::memory_order ordnen.
Die Lebensdauer eines Objekts muss die Lebensdauer aller std::atomic_refs überdauern, die auf das Objekt verweisen. Solange eine std::atomic_ref-Instanz, die auf ein Objekt verweist, existiert, muss das Objekt ausschließlich über diese std::atomic_ref-Instanzen zugegriffen werden. Kein Unterobjekt eines von einem std::atomic_ref-Objekt referenzierten Objekts darf gleichzeitig von einem anderen std::atomic_ref-Objekt referenziert werden.
Atomare Operationen, die auf ein Objekt über eine std::atomic_ref angewendet werden, sind atomar bezüglich atomarer Operationen, die über eine andere std::atomic_ref auf dasselbe Objekt angewendet werden.
Wie Referenzen in der Kernsprache, ist die Constness für std::atomic_ref flach – es ist möglich, den referenzierten Wert über ein const std::atomic_ref-Objekt zu ändern.
Wenn eine der folgenden Bedingungen erfüllt ist, ist das Programm ill-formed
- std::is_trivially_copyable_v<T> ist false.
-
is_always_lock_freeist false und std::is_volatile_v<T> ist true.
std::atomic_ref ist CopyConstructible.
Inhalt |
[bearbeiten] Verschachtelte Typen
| Typ | Definition |
value_type
|
std::remove_cv_t<T> |
difference_type
|
|
[bearbeiten] Datenmember
| Mitglied | Beschreibung |
T* ptr |
der Zeiger auf das referenzierte Objekt ((exposition-only member object*) |
| [static] |
zeigt an, dass der Typ immer lock-frei ist (öffentliche statische Member-Konstante) |
| [static] |
gibt die erforderliche Ausrichtung eines Objekts an, das von atomic_ref referenziert werden soll(öffentliche statische Member-Konstante) |
[bearbeiten] Memberfunktionen
konstruiert ein atomic_ref-Objekt(öffentliche Memberfunktion) | |
speichert einen Wert in dem von einem atomic_ref-Objekt referenzierten Objekt(öffentliche Memberfunktion) | |
prüft, ob das atomic_ref-Objekt lock-free ist(öffentliche Memberfunktion) | |
| ersetzt atomar den Wert des referenzierten Objekts durch ein nicht-atomares Argument (öffentliche Memberfunktion) | |
| erhält atomar den Wert des referenzierten Objekts (öffentliche Memberfunktion) | |
| liest einen Wert aus dem referenzierten Objekt (öffentliche Memberfunktion) | |
| ersetzt atomar den Wert des referenzierten Objekts und gibt den zuvor gehaltenen Wert zurück (öffentliche Memberfunktion) | |
| vergleicht atomar den Wert des referenzierten Objekts mit einem nicht-atomaren Argument und führt einen atomaren Austausch durch, wenn sie gleich sind, oder eine atomare Lesung, wenn sie ungleich sind (öffentliche Memberfunktion) | |
| blockiert den Thread, bis er benachrichtigt wird und der atomare Wert sich ändert (public member function) | |
| benachrichtigt mindestens einen Thread, der auf das atomare Objekt wartet (public member function) | |
| benachrichtigt alle Threads, die auf das atomare Objekt warten (public member function) | |
| (C++26) |
gibt die Adresse des Objekts zurück (öffentliche Memberfunktion) |
Nur bereitgestellt, wenn
| |
| addiert atomar das Argument zum Wert, der im referenzierten Objekt gespeichert ist, und gibt den zuvor gehaltenen Wert zurück (öffentliche Memberfunktion) | |
| subtrahiert atomar das Argument vom Wert, der im referenzierten Objekt gespeichert ist, und gibt den zuvor gehaltenen Wert zurück (öffentliche Memberfunktion) | |
| addiert oder subtrahiert atomar vom referenzierten Wert (öffentliche Memberfunktion) | |
Nur bereitgestellt, wenn
| |
| (C++26) |
führt atomar std::max zwischen dem Argument und dem Wert des referenzierten Objekts durch und gibt den zuvor gehaltenen Wert zurück (öffentliche Memberfunktion) |
| (C++26) |
führt atomar std::min zwischen dem Argument und dem Wert des referenzierten Objekts durch und gibt den zuvor gehaltenen Wert zurück (öffentliche Memberfunktion) |
| inkrementiert oder dekrementiert das referenzierte Objekt atomar um eins (öffentliche Memberfunktion) | |
Nur bereitgestellt, wenn
| |
| führt atomar bitweises AND zwischen dem Argument und dem Wert des referenzierten Objekts durch und gibt den zuvor gehaltenen Wert zurück (öffentliche Memberfunktion) | |
| führt atomar bitweises OR zwischen dem Argument und dem Wert des referenzierten Objekts durch und gibt den zuvor gehaltenen Wert zurück (öffentliche Memberfunktion) | |
| führt atomar bitweises XOR zwischen dem Argument und dem Wert des referenzierten Objekts durch und gibt den zuvor gehaltenen Wert zurück (öffentliche Memberfunktion) | |
| führt atomar bitweises AND, OR, XOR mit dem referenzierten Wert durch (öffentliche Memberfunktion) | |
[bearbeiten] Spezialisierungen
Der Standard spezifiziert, dass std::atomic_ref folgende Spezialisierungen hat
| template<> struct atomic_ref</*integral-type*/>; |
(1) | (seit C++20) |
| template<> struct atomic_ref</*floating-point-type*/>; |
(2) | (seit C++20) |
| template< class /*pointer-type*/ > requires /* siehe unten */ |
(3) | (seit C++20) |
[bearbeiten] Hinweise
Implementierungen können die spezifizierten Spezialisierungen zusammenführen. Z.B. fasst die MSVC STL sie alle in der primären Vorlage zusammen.
Wenn T cv void oder ein Funktionstyp ist, hat std::atomic_ref<T*> (d.h. std::atomic_ref<void*>, std::atomic_ref<int(*)()> usw.) keinen difference_type oder Operationen, die Zeigerarithmetik erfordern oder relationale Vergleiche(seit C++26).
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_atomic_ref |
201806L |
(C++20) | std::atomic_ref
|
__cpp_lib_constexpr_atomic |
202411L |
(C++26) | constexpr std::atomic und std::atomic_ref |
[bearbeiten] Fehlerberichte
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 | atomic_ref<T> hatte nicht implementierbare Operationen wenn T ein const Typ oder ein Zeigertyp auf kein Objekt ist |
diese Operationen sind entweder eingeschränkt oder nicht für ungeeignete T bereitgestellt |
[bearbeiten] Siehe auch
| (C++11) |
atomares Klassentemplate und Spezialisierungen für boolesche, integrale, Gleitkomma-(seit C++20) und Zeigertypen (Klassen-Template) |