atomic
Struttura
Descrive un oggetto che esegue atomic
operazioni su un valore archiviato di tipo Ty
.
Sintassi
template <class Ty>
struct atomic;
Membri
Membro | Descrizione |
---|---|
Costruttore | |
atomic |
Costruisce un oggetto atomico. |
Operatori | |
atomic::operator Ty |
Legge e restituisce il valore archiviato. (atomic::load ) |
atomic::operator= |
Usa un valore specificato per sostituire il valore archiviato. (atomic::store ) |
atomic::operator++ |
Incrementa il valore archiviato. Usato solo da specializzazioni integrali e dei puntatori. |
atomic::operator+= |
Aggiunge un valore specificato al valore archiviato. Usato solo da specializzazioni integrali e dei puntatori. |
atomic::operator-- |
Decrementa il valore archiviato . Usato solo da specializzazioni integrali e dei puntatori. |
atomic::operator-= |
Sottrae un valore specificato da un valore archiviato. Usato solo da specializzazioni integrali e dei puntatori. |
atomic::operator&= |
Esegue un bit per bit "and" (& ) su un valore specificato e sul valore archiviato. Usato solo da specializzazioni integrali. |
atomic::operator|= |
Esegue un "or" bit per bit (| ) su un valore specificato e sul valore archiviato. Usato solo da specializzazioni integrali. |
atomic::operator^= |
Esegue un "esclusivo o" bit per bit (^ ) su un valore specificato e sul valore archiviato. Usato solo da specializzazioni integrali. |
Funzioni | |
compare_exchange_strong |
Esegue un'operazione atomic_compare_and_exchange in this e restituisce il risultato. |
compare_exchange_weak |
Esegue un'operazione weak_atomic_compare_and_exchange in this e restituisce il risultato. |
fetch_add |
Aggiunge un valore specificato al valore archiviato. |
fetch_and |
Esegue un bit per bit "and" (& ) su un valore specificato e sul valore archiviato. |
fetch_or |
Esegue un "or" bit per bit (| ) su un valore specificato e sul valore archiviato. |
fetch_sub |
Sottrae un valore specificato da un valore archiviato. |
fetch_xor |
Esegue un "esclusivo o" bit per bit (^ ) su un valore specificato e sul valore archiviato. |
is_lock_free |
Specifica se atomic le operazioni su this sono libere dal blocco. Un atomic tipo è privo di blocchi se nessuna atomic operazione su quel tipo usa blocchi. |
load |
Legge e restituisce il valore archiviato. |
store |
Usa un valore specificato per sostituire il valore archiviato. |
Osservazioni:
Il tipo Ty
deve essere facilmente copiabile. Ovvero, l'utilizzo memcpy
di per copiare i byte deve produrre un oggetto valido Ty
che confronta uguale all'oggetto originale. Le compare_exchange_weak
funzioni membro e compare_exchange_strong
usano memcmp
per determinare se due Ty
valori sono uguali. Queste funzioni non useranno un oggetto Ty
definito da operator==
. Le funzioni membro di atomic
usano memcpy
per copiare i valori di tipo Ty
.
Per tutti i tipi di puntatore è disponibile una specializzazione parziale atomic<Ty*>
. La specializzazione consente l'aggiunta o la sottrazione di un offset dal valore del puntatore gestito. Le operazioni aritmetiche accettano un argomento di tipo ptrdiff_t
e modificano l'argomento in base alla dimensione di Ty
per coerenza con l'aritmetica di indirizzo ordinaria.
È disponibile una specializzazione per ogni tipo integrale, ad eccezione di bool
. Ogni specializzazione offre un set di metodi per le operazioni logiche e di aritmetica atomica.
atomic<char>
atomic<signed char>
atomic<unsigned char>
atomic<char16_t>
atomic<char32_t>
atomic<wchar_t>
atomic<short>
atomic<unsigned short>
atomic<int>
atomic<unsigned int>
atomic<long>
atomic<unsigned long>
atomic<long long>
atomic<unsigned long long>
Le specializzazioni integrali sono derivate dai tipi atomic_integral
corrispondenti. Ad esempio, atomic<unsigned int>
è derivato da atomic_uint
.
Requisiti
Intestazione: <atomic>
Spazio dei nomi: std
atomic::atomic
Costruisce un oggetto atomico.
atomic();
atomic( const atomic& );
atomic( Ty Value ) noexcept;
Parametri
Value
Valore di inizializzazione.
Osservazioni:
Gli oggetti atomici non possono essere copiati o spostati.
Gli oggetti di atomic<Ty>
cui è stata creata un'istanza possono essere inizializzati solo dal costruttore che accetta un argomento di tipo Ty
e non tramite l'inizializzazione di aggregazione. Tuttavia, atomic_integral
gli oggetti possono essere inizializzati solo usando l'inizializzazione aggregata.
atomic<int> ai0 = ATOMIC_VAR_INIT(0);
atomic<int> ai1(0);
atomic::operator Ty
Operatore per il tipo specificato nel modello, atomic<Ty>
. Recupera il valore archiviato in *this
.
atomic<Ty>::operator Ty() const volatile noexcept;
atomic<Ty>::operator Ty() const noexcept;
Osservazioni:
Questo operatore applica .memory_order_seq_cst
memory_order
atomic::operator=
Archivia un valore specificato.
Ty operator=(
Ty Value
) volatile noexcept;
Ty operator=(
Ty Value
) noexcept;
Parametri
Value
Oggetto Ty
.
Valore restituito
Restituisce Value
.
atomic::operator++
Incrementa il valore archiviato. Usato solo da specializzazioni integrali e dei puntatori.
Ty atomic<Ty>::operator++(int) volatile noexcept;
Ty atomic<Ty>::operator++(int) noexcept;
Ty atomic<Ty>::operator++() volatile noexcept;
Ty atomic<Ty>::operator++() noexcept;
Valore restituito
I primi due operatori restituiscono il valore incrementato; gli ultimi due operatori restituiscono il valore prima dell'incremento. Gli operatori usano .memory_order_seq_cst
memory_order
atomic::operator+=
Aggiunge un valore specificato al valore archiviato. Usato solo da specializzazioni integrali e dei puntatori.
Ty atomic<Ty>::operator+=(
Ty Value
) volatile noexcept;
Ty atomic<Ty>::operator+=(
Ty Value
) noexcept;
Parametri
Value
Valore integrale o puntatore.
Valore restituito
Oggetto Ty
contenente il risultato dell'addizione.
Osservazioni:
Questo operatore usa .memory_order_seq_cst
memory_order
atomic::operator--
Decrementa il valore archiviato . Usato solo da specializzazioni integrali e dei puntatori.
Ty atomic<Ty>::operator--(int) volatile noexcept;
Ty atomic<Ty>::operator--(int) noexcept;
Ty atomic<Ty>::operator--() volatile noexcept;
Ty atomic<Ty>::operator--() noexcept;
Valore restituito
I primi due operatori restituiscono il valore decrementato; gli ultimi due operatori restituiscono il valore prima del decremento. Gli operatori usano .memory_order_seq_cst
memory_order
atomic::operator-=
Sottrae un valore specificato da un valore archiviato. Usato solo da specializzazioni integrali e dei puntatori.
Ty atomic<Ty>::operator-=(
Ty Value
) volatile noexcept;
Ty atomic<Ty>::operator-=(
Ty Value
) noexcept;
Parametri
Value
Valore integrale o puntatore.
Valore restituito
Oggetto Ty
che contiene il risultato della sottrazione.
Osservazioni:
Questo operatore usa .memory_order_seq_cst
memory_order
atomic::operator&=
Esegue un "and" bit per bit (&
) su un valore specificato e il valore archiviato di *this
. Usato solo da specializzazioni integrali.
atomic<Ty>::operator&= (
Ty Value
) volatile noexcept;
atomic<Ty>::operator&= (
Ty Value
) noexcept;
Parametri
Value
Valore di tipo Ty
.
Valore restituito
Risultato del bit per bit "and" (&
).
Osservazioni:
Questo operatore esegue un'operazione di lettura-modifica/scrittura per sostituire il valore archiviato di *this
con un valore bit per bit "and" (&
) e Value
il valore corrente archiviato in *this
, all'interno dei vincoli di memory_order_seq_cst
memory_order
.
atomic::operator|=
Esegue un "or" bit per bit (|
) su un valore specificato e il valore archiviato di *this
. Usato solo da specializzazioni integrali.
atomic<Ty>::operator|= (
Ty Value
) volatile noexcept;
atomic<Ty>::operator|= (
Ty Value
) noexcept;
Parametri
Value
Valore di tipo Ty
.
Valore restituito
Risultato del bit per bit "or" (|
).
Osservazioni:
Questo operatore esegue un'operazione di lettura-modifica/scrittura per sostituire il valore archiviato di *this
con un "or"|
bit per bit () di Value
e il valore corrente archiviato in *this
, all'interno dei vincoli dei memory_order_seq_cst
memory_order
vincoli.
atomic::operator^=
Esegue un "esclusivo o" bit per bit (^
) su un valore specificato e il valore archiviato di *this
. Usato solo da specializzazioni integrali.
atomic<Ty>::operator^= (
Ty Value
) volatile noexcept;
atomic<Ty>::operator^= (
Ty Value
) noexcept;
Parametri
Value
Valore di tipo Ty
.
Valore restituito
Risultato del bit per bit "esclusivo o" (^
).
Osservazioni:
Questo operatore esegue un'operazione di lettura-modifica/scrittura per sostituire il valore archiviato di *this
con un bit per bit "esclusivo o" (^
) di Value
e il valore corrente archiviato in *this
, all'interno dei vincoli dei memory_order_seq_cst
memory_order
vincoli.
atomic::compare_exchange_strong
Esegue un'operazione di confronto e scambio atomico su *this
.
bool compare_exchange_strong(
Ty& Exp,
Ty Value,
memory_order Order1,
memory_order Order2
) volatile noexcept;
bool compare_exchange_strong(
Ty& Exp,
Ty Value,
memory_order Order1,
memory_order Order2
) noexcept;
bool compare_exchange_strong(
Ty& Exp,
Ty Value,
memory_order Order1 = memory_order_seq_cst
) volatile noexcept;
bool compare_exchange_strong(
Ty& Exp,
Ty Value,
memory_order Order1 = memory_order_seq_cst
) noexcept;
Parametri
Exp
Valore di tipo Ty
.
Value
Valore di tipo Ty
.
Order1
Primo memory_order
argomento.
Order2
Secondo argomento memory_order
.
Valore restituito
Valore bool
che indica il risultato del confronto del valore.
Osservazioni:
Questa operazione di confronto e scambio atomico confronta il valore archiviato in *this
con Exp
. Se i valori sono uguali, l'operazione sostituisce il valore archiviato in *this
con Value
usando un'operazione di lettura-modifica/scrittura e applicando i vincoli dell'ordine di memoria specificati da Order1
. Se i valori non sono uguali, l'operazione usa il valore archiviato in *this
per sostituire Exp
e applica i vincoli dell'ordine di memoria specificati da Order2
.
Gli overload che non hanno un secondo memory_order
usano un implicito Order2
basato sul valore di Order1
. Se Order1
è memory_order_acq_rel
, Order2
è memory_order_acquire
. Se Order1
è memory_order_release
, Order2
è memory_order_relaxed
. In tutti gli altri casi, Order2
è uguale a Order1
.
Per gli overload che accettano due memory_order
parametri, il valore di Order2
non deve essere memory_order_release
o memory_order_acq_rel
e non deve essere più forte del valore di Order1
.
atomic::compare_exchange_weak
Esegue un'operazione di confronto atomico debole e scambio su *this
.
bool compare_exchange_weak(
Ty& Exp,
Ty Value,
memory_order Order1,
memory_order Order2
) volatile noexcept;
bool compare_exchange_weak(
Ty& Exp,
Ty Value,
memory_order Order1,
memory_order Order2
) noexcept;
bool compare_exchange_weak(
Ty& Exp,
Ty Value,
memory_order Order1 = memory_order_seq_cst
) volatile noexcept;
bool compare_exchange_weak(
Ty& Exp,
Ty Value,
memory_order Order1 = memory_order_seq_cst
) noexcept;
Parametri
Exp
Valore di tipo Ty
.
Value
Valore di tipo Ty
.
Order1
Primo memory_order
argomento.
Order2
Secondo argomento memory_order
.
Valore restituito
Valore bool
che indica il risultato del confronto del valore.
Osservazioni:
Questa operazione di confronto e scambio atomico confronta il valore archiviato in *this
con Exp
. Se i valori sono uguali, l'operazione sostituisce il valore archiviato in *this
con Value
usando un'operazione di lettura-modifica/scrittura e applicando i vincoli dell'ordine di memoria specificati da Order1
. Se i valori non sono uguali, l'operazione usa il valore archiviato in *this
per sostituire Exp
e applica i vincoli dell'ordine di memoria specificati da Order2
.
Un'operazione di confronto e scambio atomico debole esegue uno scambio se i valori confrontati sono uguali. Se i valori non sono uguali, non è garantito che l'operazione esegua uno scambio.
Gli overload che non hanno un secondo memory_order
usano un implicito Order2
basato sul valore di Order1
. Se Order1
è memory_order_acq_rel
, Order2
è memory_order_acquire
. Se Order1
è memory_order_release
, Order2
è memory_order_relaxed
. In tutti gli altri casi, Order2
è uguale a Order1
.
Per gli overload che accettano due memory_order
parametri, il valore di Order2
non deve essere memory_order_release
o memory_order_acq_rel
e non deve essere più forte del valore di Order1
.
atomic::exchange
Usa un valore specificato per sostituire il valore archiviato di *this
.
Ty atomic<Ty>::exchange(
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
Ty atomic<Ty>::exchange(
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
Parametri
Value
Valore di tipo Ty
.
Order
Un oggetto memory_order
.
Valore restituito
Valore memorizzato di *this
prima dello scambio.
Osservazioni:
Questa operazione esegue un'operazione di lettura-modifica/scrittura da usare Value
per sostituire il valore archiviato in *this
, all'interno dei vincoli di memoria specificati da Order
.
atomic::fetch_add
Recupera il valore archiviato in *this
e quindi aggiunge un valore specificato al valore archiviato.
Ty atomic<Ty>::fetch_add (
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
Ty atomic<Ty>::fetch_add (
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
Parametri
Value
Valore di tipo Ty
.
Order
Un oggetto memory_order
.
Valore restituito
Oggetto Ty
che contiene il valore archiviato in *this
prima dell'aggiunta.
Osservazioni:
Il fetch_add
metodo esegue un'operazione di lettura-modifica/scrittura per aggiungere Value
in modo atomico al valore archiviato in *this
e applica i vincoli di memoria specificati da Order
.
atomic::fetch_and
Esegue un "and" bit per bit (&
) su un valore e un valore esistente archiviato in *this
.
Ty atomic<Ty>::fetch_and (
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
Ty atomic<Ty>::fetch_and (
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
Parametri
Value
Valore di tipo Ty
.
Order
Un oggetto memory_order
.
Valore restituito
Oggetto Ty
che contiene il risultato del bit per bit "and" (&
).
Osservazioni:
Il fetch_and
metodo esegue un'operazione di lettura-modifica/scrittura per sostituire il valore archiviato di con un "and"&
bit per bit () e il valore corrente archiviato in *this
, all'interno dei vincoli di *this
Value
memoria specificati da Order
.
atomic::fetch_or
Esegue un "or" bit per bit (|
) su un valore e un valore esistente archiviato in *this
.
Ty atomic<Ty>::fetch_or (
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
Ty atomic<Ty>::fetch_or (
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
Parametri
Value
Valore di tipo Ty
.
Order
Un oggetto memory_order
.
Valore restituito
Oggetto Ty
che contiene il risultato del bit per bit "o" (|
).
Osservazioni:
Il fetch_or
metodo esegue un'operazione di lettura-modifica/scrittura per sostituire il valore archiviato di con un "or"|
bit per bit () di e il valore corrente archiviato in *this
, all'interno dei vincoli di *this
Value
memoria specificati da Order
.
atomic::fetch_sub
Sottrae un valore specificato da un valore archiviato.
Ty atomic<Ty>::fetch_sub (
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
Ty atomic<Ty>::fetch_sub (
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
Parametri
Value
Valore di tipo Ty
.
Order
Un oggetto memory_order
.
Valore restituito
Oggetto Ty
che contiene il risultato della sottrazione.
Osservazioni:
Il fetch_sub
metodo esegue un'operazione di lettura-modifica/scrittura per sottrarre Value
in modo atomico dal valore archiviato in *this
, all'interno dei vincoli di memoria specificati da Order
.
atomic::fetch_xor
Esegue un "esclusivo" bit per bit (^
) su un valore e un valore esistente archiviato in *this
.
Ty atomic<Ty>::fetch_xor (
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
Ty atomic<Ty>::fetch_xor (
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
Parametri
Value
Valore di tipo Ty
.
Order
Un oggetto memory_order
.
Valore restituito
Oggetto Ty
che contiene il risultato del bit per bit "esclusivo o" (^
).
Osservazioni:
Il fetch_xor
metodo esegue un'operazione di lettura-modifica/scrittura per sostituire il valore archiviato di con un bit per bit "esclusivo o" (^
) di e il valore corrente archiviato in *this
e applica i vincoli di *this
Value
memoria specificati da Order
.
atomic::is_lock_free
Specifica se atomic
le operazioni su *this
sono libere dal blocco.
bool is_lock_free() const volatile noexcept;
Valore restituito
true
se atomic
le operazioni su *this
sono libere da blocchi; in caso contrario, false
.
Osservazioni:
Un atomic
tipo è privo di blocchi se nessuna atomic
operazione su quel tipo usa blocchi.
atomic::load
Recupera il valore archiviato in *this
, all'interno dei vincoli di memoria specificati.
Ty atomic::load(
memory_order Order = memory_order_seq_cst
) const volatile noexcept;
Ty atomic::load(
memory_order Order = memory_order_seq_cst
) const noexcept;
Parametri
Order
Un oggetto memory_order
. Order
non deve essere memory_order_release
o memory_order_acq_rel
.
Valore restituito
Valore recuperato archiviato in *this
.
atomic::store
Archivia un valore specificato.
void atomic<Ty>::store(
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
void atomic<Ty>::store(
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
Parametri
Value
Oggetto Ty
.
Order
Vincolo memory_order
.
Osservazioni:
Questa funzione membro archivia Value
in modo atomico in *this
, all'interno dei vincoli di memoria specificati da Order
.