Namensräume
Varianten
Aktionen

std::atomic_ref

Von cppreference.com
< cpp‎ | atomic
 
 
Bibliothek für nebenläufige Programmierung
Threads
(C++11)
(C++20)
this_thread Namespace
(C++11)
(C++11)
(C++11)
Kooperatives Beenden
Gegenseitiger Ausschluss
(C++11)
Allgemeines Sperrungsmanagement
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Bedingungsvariablen
(C++11)
Semaphoren
Latches und Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
(C++11)
Sichere Wiederherstellung
(C++26)
Hazard Pointer
Atomare Typen
(C++11)
atomic_ref
(C++20)
Initialisierung von atomaren Typen
(C++11)(veraltet in C++20)
(C++11)(veraltet in C++20)
Speicherordnung
(C++11)(deprecated in C++26)
Freie Funktionen für atomare Operationen
Freie Funktionen für atomare Flags
 
 
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::atomic_ref ist CopyConstructible.

Inhalt

[bearbeiten] Verschachtelte Typen

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

[bearbeiten] Datenmember

Mitglied Beschreibung
T* ptr der Zeiger auf das referenzierte Objekt
((exposition-only member object*)
zeigt an, dass der Typ immer lock-frei ist
(öffentliche statische Member-Konstante) [bearbeiten]
gibt die erforderliche Ausrichtung eines Objekts an, das von atomic_ref referenziert werden soll
(öffentliche statische Member-Konstante) [bearbeiten]

[bearbeiten] Memberfunktionen

konstruiert ein atomic_ref-Objekt
(öffentliche Memberfunktion) [bearbeiten]
speichert einen Wert in dem von einem atomic_ref-Objekt referenzierten Objekt
(öffentliche Memberfunktion) [bearbeiten]
prüft, ob das atomic_ref-Objekt lock-free ist
(öffentliche Memberfunktion) [bearbeiten]
ersetzt atomar den Wert des referenzierten Objekts durch ein nicht-atomares Argument
(öffentliche Memberfunktion) [bearbeiten]
erhält atomar den Wert des referenzierten Objekts
(öffentliche Memberfunktion) [bearbeiten]
liest einen Wert aus dem referenzierten Objekt
(öffentliche Memberfunktion) [bearbeiten]
ersetzt atomar den Wert des referenzierten Objekts und gibt den zuvor gehaltenen Wert zurück
(öffentliche Memberfunktion) [bearbeiten]
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) [bearbeiten]
blockiert den Thread, bis er benachrichtigt wird und der atomare Wert sich ändert
(public member function) [edit]
benachrichtigt mindestens einen Thread, der auf das atomare Objekt wartet
(public member function) [edit]
benachrichtigt alle Threads, die auf das atomare Objekt warten
(public member function) [edit]
(C++26)
gibt die Adresse des Objekts zurück
(öffentliche Memberfunktion) [bearbeiten]
Nur bereitgestellt, wenn T ein arithmetischer Typ außer cv bool oder ein Zeigertyp auf ein Objekt ist
addiert atomar das Argument zum Wert, der im referenzierten Objekt gespeichert ist, und gibt den zuvor gehaltenen Wert zurück
(öffentliche Memberfunktion) [bearbeiten]
subtrahiert atomar das Argument vom Wert, der im referenzierten Objekt gespeichert ist, und gibt den zuvor gehaltenen Wert zurück
(öffentliche Memberfunktion) [bearbeiten]
addiert oder subtrahiert atomar vom referenzierten Wert
(öffentliche Memberfunktion) [bearbeiten]
Nur bereitgestellt, wenn T ein ganzzahliger Typ außer cv bool oder ein Zeigertyp auf ein Objekt ist
(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) [bearbeiten]
(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) [bearbeiten]
inkrementiert oder dekrementiert das referenzierte Objekt atomar um eins
(öffentliche Memberfunktion) [bearbeiten]
Nur bereitgestellt, wenn T ein ganzzahliger Typ außer cv bool ist
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) [bearbeiten]
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) [bearbeiten]
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) [bearbeiten]
führt atomar bitweises AND, OR, XOR mit dem referenzierten Wert durch
(öffentliche Memberfunktion) [bearbeiten]

[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 */

struct atomic_ref</*pointer-type*/>;
(3) (seit C++20)
1) /*integral-type*/ bezeichnet einen möglicherweise cv-qualifizierten ganzzahligen 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 Zeigertypen auf Objekte sind.

[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) [bearbeiten]