Namensräume
Varianten
Aktionen

std::atomic<std::weak_ptr>

Von cppreference.com
< cpp‎ | memory‎ | weak ptr
 
 
Speicherverwaltungsbibliothek
(nur Exposition*)
Algorithmen für uninitialisierten Speicher
(C++17)
(C++17)
(C++17)
Beschränkte uninitialisierte
Speicher-Algorithmen
C-Bibliothek

Allocatoren
Speicherressourcen
Unterstützung für Garbage Collection
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
Uninitialisierter Speicher
Explizites Lebenszeitmanagement
 
 
Definiert in Header <memory>
template< class T > struct std::atomic<std::weak_ptr<T>>;
(seit C++20)

Die partielle Template-Spezialisierung von std::atomic für std::weak_ptr<T> erlaubt Benutzern, weak_ptr-Objekte atomar zu manipulieren.

Wenn mehrere Threads auf dasselbe std::weak_ptr-Objekt ohne Synchronisation zugreifen und einer dieser Zugriffe eine nicht-const Memberfunktion von weak_ptr verwendet, tritt ein Datenwettlauf auf, es sei denn, alle solchen Zugriffe werden über eine Instanz von std::atomic<std::weak_ptr> durchgeführt.

Assoziierte use_count-Inkremente sind garantiert Teil der atomaren Operation. Assoziierte use_count-Dekremente werden nach der atomaren Operation sequenziert, müssen aber nicht Teil davon sein, außer bei der use_count-Änderung beim Überschreiben von expected in einem fehlgeschlagenen CAS. Jegliche assoziierte Löschung und Deallokation werden nach dem atomaren Aktualisierungsschritt sequenziert und sind nicht Teil der atomaren Operation.

Beachten Sie, dass der von std::weak_ptr und std::shared_ptr verwendete Kontrollblock threadsicher ist: Unterschiedliche nicht-atomare std::weak_ptr-Objekte können gleichzeitig von mehreren Threads mit veränderbaren Operationen, wie operator= oder reset, zugegriffen werden, auch wenn diese Instanzen Kopien sind oder intern denselben Kontrollblock teilen.

Der Typ T darf ein unvollständiger Typ sein.

Inhalt

[edit] Member types

Mitgliedertyp Definition
value_type std::weak_ptr<T>

[edit] Member functions

Alle nicht spezialisierten std::atomic-Funktionen werden auch von dieser Spezialisierung bereitgestellt, und keine zusätzlichen Memberfunktionen.

atomic<weak_ptr<T>>::atomic

constexpr atomic() noexcept = default;
(1)
atomic(std::weak_ptr<T> desired) noexcept;
(2)
atomic(const atomic&) = delete;
(3)
1) Initialisiert den zugrundeliegenden weak_ptr<T> mit einem standardkonstruierten Wert.
2) Initialisiert den zugrundeliegenden weak_ptr<T> mit einer Kopie von desired. Wie bei jedem std::atomic-Typ ist die Initialisierung keine atomare Operation.
3) Atomare Typen sind nicht kopier-/verschiebkonstruierbar.

atomic<weak_ptr<T>>::operator=

void operator=(const atomic&) = delete;
(1)
void operator=(std::weak_ptr<T> desired) noexcept;
(2)
1) Atomare Typen sind nicht kopier-/verschiebzuweisbar.
2) Wertzuweisung, äquivalent zu store(desired).

atomic<weak_ptr<T>>::is_lock_free

bool is_lock_free() const noexcept;

Gibt true zurück, wenn die atomaren Operationen auf allen Objekten dieses Typs sperrfrei sind, andernfalls false.

atomic<weak_ptr<T>>::store

void store(std::weak_ptr<T> desired,
           std::memory_order order = std::memory_order_seq_cst) noexcept;

Ersetzt atomar den Wert von *this durch den Wert von desired, als ob durch p.swap(desired), wobei p das zugrundeliegende std::weak_ptr<T> ist. Der Speicher wird gemäß order geordnet. Das Verhalten ist undefiniert, wenn order std::memory_order_consume, std::memory_order_acquire oder std::memory_order_acq_rel ist.

atomic<weak_ptr<T>>::load

Gibt atomar eine Kopie des zugrundeliegenden std::weak_ptr<T> zurück. Der Speicher wird gemäß order geordnet. Das Verhalten ist undefiniert, wenn order std::memory_order_release oder std::memory_order_acq_rel ist.

atomic<weak_ptr<T>>::operator std::weak_ptr<T>

operator std::weak_ptr<T>() const noexcept;

Äquivalent zu return load();.

atomic<weak_ptr<T>>::exchange

std::weak_ptr<T> exchange(std::weak_ptr<T> desired,
                          std::memory_order order = std::memory_order_seq_cst) noexcept;

Ersetzt atomar das zugrundeliegende std::weak_ptr<T> durch desired, als ob durch p.swap(desired), wobei p das zugrundeliegende std::weak_ptr<T> ist, und gibt eine Kopie des Wertes zurück, den p unmittelbar vor dem Tausch hatte. Der Speicher wird gemäß order geordnet. Dies ist eine atomare Lese-Änderungs-Schreib-Operation.

atomic<weak_ptr<T>>::compare_exchange_weak, compare_exchange_strong

bool compare_exchange_strong(std::weak_ptr<T>& expected, std::weak_ptr<T> desired,
                             std::memory_order success, std::memory_order failure) noexcept;
(1)
bool compare_exchange_weak(std::weak_ptr<T>& expected, std::weak_ptr<T> desired,
                           std::memory_order success, std::memory_order failure) noexcept;
(2)
bool compare_exchange_strong(std::weak_ptr<T>& expected, std::weak_ptr<T> desired,
                             std::memory_order order = std::memory_order_seq_cst) noexcept;
(3)
bool compare_exchange_weak(std::weak_ptr<T>& expected, std::weak_ptr<T> desired,
                           std::memory_order order = std::memory_order_seq_cst) noexcept;
(4)
1) Wenn das zugrundeliegende std::weak_ptr<T> denselben Zeigerwert wie expected speichert und sich den Besitz mit ihm teilt, oder wenn sowohl das zugrundeliegende als auch expected leer sind, wird desired in das zugrundeliegende std::weak_ptr<T> zugewiesen, und es wird true zurückgegeben und der Speicher gemäß success geordnet. Andernfalls wird der Wert von dem zugrundeliegenden std::weak_ptr<T> nach expected kopiert, false zurückgegeben und der Speicher gemäß failure geordnet. Das Verhalten ist undefiniert, wenn failure std::memory_order_release oder std::memory_order_acq_rel ist. Im Erfolgsfall ist die Operation eine atomare Lese-Änderungs-Schreib-Operation auf *this und expected wird nach der atomaren Aktualisierung nicht zugegriffen. Im Fehlerfall ist die Operation eine atomare Lese-Operation auf *this und expected wird mit dem aktuellen Wert, der aus dem atomaren Objekt gelesen wurde, aktualisiert. Diese Aktualisierung des use_count von expected ist Teil dieser atomaren Operation, obwohl der Schreibvorgang selbst (und jegliche nachfolgende Deallokation/Zerstörung) nicht zwingend erforderlich ist.
2) Identisch mit (1), kann aber auch fehlerhaft fehlschlagen.
3) Äquivalent zu: return compare_exchange_strong(expected, desired, order, fail_order);, wobei fail_order dasselbe ist wie order, mit der Ausnahme, dass std::memory_order_acq_rel durch std::memory_order_acquire und std::memory_order_release durch std::memory_order_relaxed ersetzt wird.
4) Äquivalent zu: return compare_exchange_weak(expected, desired, order, fail_order);, wobei fail_order dasselbe ist wie order, mit der Ausnahme, dass std::memory_order_acq_rel durch std::memory_order_acquire und std::memory_order_release durch std::memory_order_relaxed ersetzt wird.

atomic<weak_ptr<T>>::wait

void wait(std::weak_ptr<T> old
          std::memory_order order = std::memory_order_seq_cst) const noexcept;

Führt eine atomare Warteoperation aus.

Vergleicht load(order) mit old und blockiert, wenn sie äquivalent sind, bis *this durch notify_one() oder notify_all() benachrichtigt wird. Dies wird wiederholt, bis sich load(order) ändert. Diese Funktion gibt garantiert nur zurück, wenn sich der Wert geändert hat, auch wenn die zugrundeliegende Implementierung fehlerhaft aufwacht.

Der Speicher wird gemäß order geordnet. Das Verhalten ist undefiniert, wenn order std::memory_order_release oder std::memory_order_acq_rel ist.

Hinweise: Zwei std::weak_ptrs sind äquivalent, wenn sie denselben Zeiger speichern und entweder den Besitz teilen oder beide leer sind.

atomic<weak_ptr<T>>::notify_one

void notify_one() noexcept;

Führt eine atomare Benachrichtigungsoperation aus.

Wenn ein Thread in atomaren Warteoperationen (d.h. wait()) auf *this blockiert ist, wird mindestens ein solcher Thread entblockiert; andernfalls geschieht nichts.

atomic<weak_ptr<T>>::notify_all

void notify_all() noexcept;

Führt eine atomare Benachrichtigungsoperation aus.

Entblockiert alle Threads, die in atomaren Warteoperationen (d.h. wait()) auf *this blockiert sind, falls vorhanden; andernfalls geschieht nichts.

[edit] Member constants

Die einzige standardmäßige std::atomic-Memberkonstante is_always_lock_free wird auch von dieser Spezialisierung bereitgestellt.

atomic<weak_ptr<T>>::is_always_lock_free

static constexpr bool is_always_lock_free = /*implementierungsdefiniert*/;

[edit] Example

[edit] See also

(C++11)
atomares Klassentemplate und Spezialisierungen für boolesche, integrale, Gleitkomma-(seit C++20) und Zeigertypen
(Klassen-Template) [bearbeiten]