std:: atomic <std::weak_ptr>
|
Definiert im 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 > ermöglicht es Benutzern, weak_ptr-Objekte atomar zu manipulieren.
Wenn mehrere Ausführungsstränge auf dasselbe std::weak_ptr -Objekt zugreifen ohne Synchronisierung und einer dieser Zugriffe eine nicht-konstante Memberfunktion von weak_ptr verwendet, dann tritt ein Datenwettlauf auf, es sei denn, alle derartigen Zugriffe erfolgen über eine Instanz von std:: atomic < std:: weak_ptr > .
Assoziierte
use_count
Inkremente sind garantiert Teil der atomaren Operation. Assoziierte
use_count
Dekremente sind nach der atomaren Operation sequenziert, müssen jedoch nicht Teil davon sein, außer bei der
use_count
Änderung beim Überschreiben von
expected
in einer fehlgeschlagenen CAS-Operation. Jede assoziierte Löschung und Freigabe ist nach dem atomaren Aktualisierungsschritt sequenziert und nicht Teil der atomaren Operation.
Beachten Sie, dass der Kontrollblock, der von
std::weak_ptr
und
std::shared_ptr
verwendet wird, threadsicher ist: Unterschiedliche nicht-atomare
std::weak_ptr
-Objekte können mit veränderlichen Operationen, wie
operator
=
oder
reset
, gleichzeitig von mehreren Threads zugreifen, selbst wenn diese Instanzen Kopien sind oder intern denselben Kontrollblock teilen.
Der Typ
T
kann ein unvollständiger Typ sein.
Mitgliedertypen
| Mitgliedstyp | Definition |
value_type
|
std:: weak_ptr < T > |
Memberfunktionen
Alle nicht-spezialisierten std::atomic Funktionen werden auch von dieser Spezialisierung bereitgestellt, und es gibt keine zusätzlichen Member-Funktionen.
atomic<weak_ptr<T>>:: atomic
|
constexpr
atomic
(
)
noexcept
=
default
;
|
(1) | |
|
atomic
(
std::
weak_ptr
<
T
>
desired
)
noexcept
;
|
(2) | |
|
atomic
(
const
atomic
&
)
=
delete
;
|
(3) | |
weak_ptr<T>
mit dem Standardkonstruktor-Wert.
weak_ptr<T>
mit einer Kopie von
desired
. Wie bei jedem
std::atomic
-Typ ist die Initialisierung kein atomarer Vorgang.
atomic<weak_ptr<T>>:: operator=
|
void
operator
=
(
const
atomic
&
)
=
delete
;
|
(1) | |
|
void
operator
=
(
std::
weak_ptr
<
T
>
desired
)
noexcept
;
|
(2) | |
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
mit dem Wert von
desired
wie durch
p.
swap
(
desired
)
, wobei
p
das zugrundeliegende
std::
weak_ptr
<
T
>
ist. Der Speicherzugriff 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
|
std::
weak_ptr
<
T
>
load
(
std::
memory_order
order
=
std::
memory_order_seq_cst
)
const
noexcept
;
|
||
Gibt atomar eine Kopie des zugrunde liegenden
std::
weak_ptr
<
T
>
zurück. Der Speicherzugriff 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
;
|
||
Entspricht 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
>
mit
desired
wie 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 Austausch hatte. Der Speicherzugriff wird gemäß
order
geordnet. Dies ist eine atomare Lese-Modifizier-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) | |
expected
speichert und Besitz mit ihm teilt, oder wenn sowohl der zugrundeliegende als auch
expected
leer sind, weist
desired
dem zugrundeliegenden
std::
weak_ptr
<
T
>
zu, gibt
true
zurück und ordnet den Speicher gemäß
success
, andernfalls weist es den zugrundeliegenden
std::
weak_ptr
<
T
>
an
expected
zu, gibt
false
zurück und ordnet den Speicher gemäß
failure
. Das Verhalten ist undefiniert, wenn
failure
std::memory_order_release
oder
std::memory_order_acq_rel
ist. Bei Erfolg ist der Vorgang eine atomare Lese-Modifizier-Schreib-Operation auf
*
this
und
expected
wird nach der atomaren Aktualisierung nicht mehr zugegriffen. Bei Misserfolg ist der Vorgang eine atomare Ladeoperation auf
*
this
und
expected
wird mit dem vorhandenen Wert aus dem atomaren Objekt aktualisiert. Diese Aktualisierung des use_count von
expected
ist Teil dieser atomaren Operation, obwohl der Schreibvorgang selbst (und jede nachfolgende Freigabe/Zerstörung) nicht zwingend atomar sein muss.
fail_order
gleich
order
ist, außer dass
std::memory_order_acq_rel
ersetzt wird durch
std::memory_order_acquire
und
std::memory_order_release
ersetzt wird durch
std::memory_order_relaxed
.
fail_order
gleich
order
ist, außer dass
std::memory_order_acq_rel
ersetzt wird durch
std::memory_order_acquire
und
std::memory_order_release
ersetzt wird durch
std::memory_order_relaxed
.
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, falls 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, selbst wenn die zugrundeliegende Implementierung fälschlicherweise entblockt.
Der Speicherzugriff wird gemäß
order
geordnet. Das Verhalten ist undefiniert, wenn
order
std::memory_order_release
oder
std::memory_order_acq_rel
ist.
Hinweis: Zwei std::weak_ptr sind äquivalent, wenn sie denselben Zeiger speichern und entweder gemeinsamen Besitz teilen oder beide leer sind.
atomic<weak_ptr<T>>:: notify_one
|
void
notify_one
(
)
noexcept
;
|
||
Führt eine atomare Benachrichtigungsoperation aus.
Falls ein Thread in atomaren Wartevorgängen (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 durch.
Entsperrt alle Threads, die in atomaren Wartevorgängen (d.h.
wait()
) auf
*
this
blockiert sind, falls vorhanden; andernfalls tut sie nichts.
Memberkonstanten
Die einzige standardmäßige
std::atomic
Member-Konstante
is_always_lock_free
wird ebenfalls von dieser Spezialisierung bereitgestellt.
atomic<weak_ptr<T>>:: is_always_lock_free
|
static
constexpr
bool
is_always_lock_free
=
/*implementierungsdefiniert*/
;
|
||
Beispiel
|
Dieser Abschnitt ist unvollständig
Grund: Kein Beispiel |
Siehe auch
|
(C++11)
|
Atomic-Klassen-Template und Spezialisierungen für bool, Ganzzahl,
Gleitkomma,
(seit C++20)
und Zeigertypen
(Klassen-Template) |