std::atomic_...<std::shared_ptr>
| Definiert in Header <memory> |
||
| template< class T > bool atomic_is_lock_free( const std::shared_ptr<T>* p ); |
(1) | (seit C++11) (veraltet in C++20) (entfernt in C++26) |
| template< class T > std::shared_ptr<T> atomic_load( const std::shared_ptr<T>* p ); |
(2) | (seit C++11) (veraltet in C++20) (entfernt in C++26) |
| template< class T > std::shared_ptr<T> atomic_load_explicit |
(3) | (seit C++11) (veraltet in C++20) (entfernt in C++26) |
| template< class T > void atomic_store( std::shared_ptr<T>* p, std::shared_ptr<T> r ); |
(4) | (seit C++11) (veraltet in C++20) (entfernt in C++26) |
| template< class T > void atomic_store_explicit |
(5) | (seit C++11) (veraltet in C++20) (entfernt in C++26) |
| template< class T > std::shared_ptr<T> atomic_exchange |
(6) | (seit C++11) (veraltet in C++20) (entfernt in C++26) |
| template< class T > std::shared_ptr<T> atomic_exchange_explicit |
(7) | (seit C++11) (veraltet in C++20) (entfernt in C++26) |
| template< class T > bool atomic_compare_exchange_weak |
(8) | (seit C++11) (veraltet in C++20) (entfernt in C++26) |
| template< class T > bool atomic_compare_exchange_strong |
(9) | (seit C++11) (veraltet in C++20) (entfernt in C++26) |
| template< class T > bool atomic_compare_exchange_strong_explicit |
(10) | (seit C++11) (veraltet in C++20) (entfernt in C++26) |
| template< class T > bool atomic_compare_exchange_weak_explicit |
(11) | (seit C++11) (veraltet in C++20) (entfernt in C++26) |
Wenn mehrere Ausführungsfäden gleichzeitig auf dasselbe std::shared_ptr Objekt ohne Synchronisation zugreifen und einer dieser Zugriffe eine nicht-const-Memberfunktion von shared_ptr verwendet, tritt ein Datenrennen auf, es sei denn, alle solchen Zugriffe erfolgen über diese Funktionen, die Überladungen der entsprechenden atomaren Zugriffsfunktionen sind (std::atomic_load, std::atomic_store, etc.).
Beachten Sie, dass der Kontrollblock eines shared_ptr threadsicher ist: Unterschiedliche std::shared_ptr Objekte können gleichzeitig von mehreren Threads über veränderliche Operationen wie operator= oder reset zugegriffen werden, auch wenn diese Instanzen Kopien sind und intern denselben Kontrollblock gemeinsam nutzen.
(p, expected, desired, std::memory_order_seq_cst,
std::memory_order_seq_cst).
(p, expected, desired, std::memory_order_seq_cst,
std::memory_order_seq_cst).
- Wenn sie äquivalent sind (den gleichen Zeigerwert speichern und entweder den Besitz desselben Objekts gemeinsam nutzen oder beide leer sind), weist desired unter Verwendung der von success angegebenen Speicherreihenfolgenbeschränkungen in *p zu und gibt true zurück.
- Wenn sie nicht äquivalent sind, weist *p unter Verwendung der von failure angegebenen Speicherreihenfolgenbeschränkungen in *expected zu und gibt false zurück.
atomic_compare_exchange_weak_explicit kann fehlerhaft fehlschlagen.Wenn p ein Nullzeiger ist, ist das Verhalten aller dieser Funktionen undefiniert.
Inhalt |
[edit] Parameter
| p, expected | - | Ein Zeiger auf einen std::shared_ptr |
| r, desired | - | Ein std::shared_ptr |
| mo, success, failure | - | Speicherreihenfolgen-Selektoren vom Typ std::memory_order |
[edit] Ausnahmen
Diese Funktionen werfen keine Ausnahmen.
[edit] Rückgabewert
[edit] Hinweise
Diese Funktionen werden typischerweise mithilfe von Mutexen implementiert, die in einer globalen Hashtabelle gespeichert sind, wobei der Zeigerwert als Schlüssel verwendet wird.
Die Concurrency TS bietet atomare Smart-Pointer-Klassen atomic_shared_ptr und atomic_weak_ptr als Ersatz für die Verwendung dieser Funktionen.
|
Diese Funktionen wurden zugunsten der Spezialisierungen der std::atomic-Vorlage veraltet: std::atomic<std::shared_ptr> und std::atomic<std::weak_ptr>. |
(seit C++20) (bis C++26) |
|
Diese Funktionen wurden zugunsten der Spezialisierungen der std::atomic-Vorlage entfernt: std::atomic<std::shared_ptr> und std::atomic<std::weak_ptr>. |
(seit C++26) |
[edit] Beispiel
| Dieser Abschnitt ist unvollständig Grund: kein Beispiel |
[edit] 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 2172 | C++11 | expected konnte ein Nullzeiger sein | das Verhalten ist in diesem Fall undefiniert |
| LWG 2980 | C++11 | leere shared_ptr waren nie äquivalent |
äquivalent, wenn sie den gleichen Zeigerwert speichern |
[edit] Siehe auch
| (C++11) |
prüft, ob die Operationen des atomaren Typs sperrfrei sind (Funktions-Template) |
| (C++11)(C++11) |
ersetzt atomar den Wert des atomaren Objekts durch ein nicht-atomares Argument (Funktions-Template) |
| (C++11)(C++11) |
liest atomar den Wert aus einem atomaren Objekt (Funktions-Template) |
| (C++11)(C++11) |
ersetzt atomar den Wert des atomaren Objekts durch ein nicht-atomares Argument und gibt den alten Wert des atomaren Objekts zurück (Funktions-Template) |
| vergleicht atomar den Wert des atomaren Objekts mit einem nicht-atomaren Argument und führt bei Gleichheit einen atomaren Austausch oder bei Ungleichheit eine atomare Ladeoperation durch (Funktions-Template) |