Namespaces
Variants

std:: atomic_ref

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
atomic_ref
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
Definiert im Header <atomic>
template < class T >
struct atomic_ref ;
(seit C++20)

Die std::atomic_ref -Klassenvorlage wendet atomare Operationen auf das Objekt an, auf das sie verweist.

Für die Lebensdauer des std::atomic_ref -Objekts wird das referenzierte Objekt als atomares Objekt betrachtet. 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). Darüber hinaus können Zugriffe auf atomare Objekte Thread-synchronisation herstellen und nicht-atomare Speicherzugriffe gemäß std::memory_order anordnen.

Die Lebensdauer eines Objekts muss die Lebensdauer aller std::atomic_ref s überschreiten, die auf das Objekt verweisen. Solange eine std::atomic_ref -Instanz existiert, die auf ein Objekt verweist, muss auf das Objekt ausschließlich über diese std::atomic_ref -Instanzen zugegriffen werden. Kein Unterobjekt eines Objekts, auf das ein std::atomic_ref -Objekt verweist, darf gleichzeitig von einem anderen std::atomic_ref -Objekt referenziert werden.

Auf ein Objekt angewendete atomare Operationen durch einen std::atomic_ref sind atomar in Bezug auf atomare Operationen, die durch jeden anderen std::atomic_ref ausgeführt werden, der auf dasselbe Objekt verweist.

Wie bei Referenzen in der Kernsprache ist die Constness für std::atomic_ref oberflächlich - es ist möglich, den referenzierten Wert durch ein const std::atomic_ref Objekt zu modifizieren.

Wenn eine der folgenden Bedingungen erfüllt ist, ist das Programm fehlerhaft:

std::atomic_ref ist CopyConstructible .

Inhaltsverzeichnis

Verschachtelte Typen

Typ Definition
value_type std:: remove_cv_t < T >
difference_type
  • value_type , falls T ein arithmetischer Typ außer cv bool ist.
  • Andernfalls, std::ptrdiff_t , falls T ein Zeiger-auf-Objekt-Typ ist.
  • Andernfalls, nicht definiert.

Datenmitglieder

Mitglied Beschreibung
T * ptr der Zeiger auf das referenzierte Objekt
( Nur zur Veranschaulichung dienendes Mitgliedsobjekt* )
zeigt an, dass der Typ immer sperrfrei ist
(öffentliche statische Mitgliedskonstante)
zeigt die erforderliche Ausrichtung eines Objekts an, das von atomic_ref referenziert werden soll
(öffentliche statische Mitgliedskonstante)

Memberfunktionen

Konstruiert ein atomic_ref Objekt
(öffentliche Elementfunktion)
speichert einen Wert in das durch ein atomic_ref Objekt referenzierte Objekt
(öffentliche Elementfunktion)
prüft, ob das atomic_ref -Objekt sperrfrei ist
(öffentliche Elementfunktion)
ersetzt den Wert des referenzierten Objekts atomar mit einem nicht-atomaren Argument
(öffentliche Elementfunktion)
holt den Wert des referenzierten Objekts atomar
(öffentliche Elementfunktion)
lädt einen Wert aus dem referenzierten Objekt
(öffentliche Elementfunktion)
ersetzt den Wert des referenzierten Objekts atomar und erhält den zuvor gehaltenen Wert
(öffentliche Elementfunktion)
vergleicht atomar den Wert des referenzierten Objekts mit einem nicht-atomaren Argument und führt einen atomaren Austausch durch, wenn gleich, oder eine atomare Ladung, wenn nicht gleich
(öffentliche Mitgliedsfunktion)
blockiert den Thread, bis eine Benachrichtigung erfolgt und der atomare Wert sich ändert
(öffentliche Elementfunktion)
benachrichtigt mindestens einen auf das atomare Objekt wartenden Thread
(öffentliche Elementfunktion)
benachrichtigt alle Threads, die auf das atomare Objekt warten
(öffentliche Elementfunktion)
(C++26)
gibt die Adresse des Objekts zurück
(öffentliche Elementfunktion)
Nur bereitgestellt, wenn T ein arithmetischer Typ ist, außer cv bool oder ein Zeiger-auf-Objekt-Typ
fügt atomar das Argument zum im referenzierten Objekt gespeicherten Wert hinzu und erhält den zuvor gehaltenen Wert
(öffentliche Elementfunktion)
subtrahiert atomar das Argument vom im referenzierten Objekt gespeicherten Wert und erhält den zuvor gehaltenen Wert
(öffentliche Elementfunktion)
addiert oder subtrahiert atomar vom referenzierten Wert
(öffentliche Elementfunktion)
Nur bereitgestellt, wenn T ein integraler Typ ist, außer cv bool oder ein Zeiger-auf-Objekt-Typ
(C++26)
führt atomar std::max zwischen dem Argument und dem Wert des referenzierten Objekts aus und erhält den zuvor gehaltenen Wert
(öffentliche Member-Funktion)
(C++26)
führt atomar std::min zwischen dem Argument und dem Wert des referenzierten Objekts aus und erhält den zuvor gehaltenen Wert
(öffentliche Member-Funktion)
erhöht oder verringert das referenzierte Objekt atomar um eins
(öffentliche Elementfunktion)
Nur bereitgestellt, wenn T ein integraler Typ ist, außer cv bool
führt atomar eine bitweise UND-Operation zwischen dem Argument und dem Wert des referenzierten Objekts durch und erhält den zuvor gehaltenen Wert
(öffentliche Elementfunktion)
führt atomar eine bitweise OR-Operation zwischen dem Argument und dem Wert des referenzierten Objekts durch und erhält den zuvor gehaltenen Wert
(öffentliche Elementfunktion)
führt atomar eine bitweise XOR-Operation zwischen dem Argument und dem Wert des referenzierten Objekts durch und erhält den zuvor gehaltenen Wert
(öffentliche Elementfunktion)
führt atomare bitweise UND-, ODER- und XOR-Operationen mit dem referenzierten Wert aus
(öffentliche Elementfunktion)

Spezialisierungen

Die Norm legt fest, 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 */

struct atomic_ref < /*pointer-type*/ > ;
(3) (seit C++20)
1) /*integral-type*/ bezeichnet einen möglicherweise cv-qualifizierten integralen Typ außer cv bool .
2) /*floating-point-type*/ bezeichnet einen möglicherweise cv-qualifizierten Gleitkommatyp.
3) Die partielle Spezialisierung wird für /*pointer-type*/ -Typen bereitgestellt, die möglicherweise cv-qualifizierte Zeiger-auf-Objekt-Typen sind.

Hinweise

Implementierungen können die angegebenen Spezialisierungen zusammenführen. Z.B. führt MSVC STL alle von ihnen in die primäre Vorlage zusammen.

Wenn T cv void oder ein Funktionstyp ist, std :: atomic_ref < T * > (d.h. std :: atomic_ref < void * > , std :: atomic_ref < int ( * ) ( ) > etc.) besitzt weder difference_type noch 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

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 3508
( P3323R1 )
C++20 atomic_ref < T > hatte nicht implementierbare Operationen
wenn T ein const -Typ oder Zeiger-auf-Nicht-Objekt-Typ ist
diese Operationen sind entweder eingeschränkt
oder für ungeeignete T nicht bereitgestellt

Siehe auch

(C++11)
atomic-Klassen-Template und Spezialisierungen für bool, Ganzzahltypen, Gleitkommatypen, (seit C++20) und Zeigertypen
(Klassen-Template)