<atomic>
Definisce le classi e le classi modello da utilizzare per creare tipi che supportano le operazioni atomiche.
#include <atomic>
Note
[!NOTA]
Nel codice compilato utilizzando /clr o /clr:pure, questa intestazione è bloccata.
Un'operazione atomica ha due proprietà chiave che consentono di utilizzare più thread correttamente per modificare un oggetto senza l'utilizzo di blocchi del mutex.
Poiché un'operazione atomica è unificatore, una seconda operazione atomica nello stesso oggetto da un altro thread può ottenere lo stato dell'oggetto solo prima o dopo la prima operazione atomica.
In base all'argomento memory_order, un'operazione atomica stabilisce i requisiti dell'ordine per la visibilità degli effetti di altre operazioni atomiche nello stesso thread.Pertanto, inibisce le ottimizzazioni del compilatore che violano i requisiti dell'ordine.
In alcune piattaforme, potrebbe non essere possibile distribuire in modo efficiente le operazioni atomiche per alcuni tipi senza l'utilizzo di blocchi mutex.Un tipo è atomico senza blocco senza operazioni atomiche i blocchi di tale utilizzo del tipo.
La classe atomic_flag fornisce un tipo definito atomico minimo che utilizza un flag bool.Le operazioni sono sempre senza blocco.
La classe modello atomic<Ty> archivia un oggetto del tipo di argomento Ty e fornisce accesso in modalità atomica sul valore memorizzato.È possibile crearne un'istanza utilizzando qualsiasi tipo che può essere copiato tramite memcpy e da testare l'uguaglianza mediante memcmp.In particolare, è possibile utilizzarlo con tipi definiti dall'utente che soddisfano questi requisiti e, in molti casi, con tipi a virgola mobile.
Il modello dispone di un set di specializzazioni per i tipi integrali e di specializzazione parziale per i puntatori.Queste specializzazioni forniscono operazioni aggiuntive che non sono disponibili tramite il modello primario.
Specializzazioni di puntatore
Le specializzazioni parziali atomic<Ty *> si applicano a tutti i tipi di puntatore.Fornisce metodi per operazioni aritmetiche.
Specializzazioni integrali
Le specializzazioni atomic<integral> si applicano a tutti i tipi integrali.Forniscono operazioni aggiuntive che non sono disponibili tramite il modello primario.
Ogni tipo atomic<integral> dispone di una macro corrispondente che è possibile utilizzare in if directive per determinare in fase di compilazione se le operazioni su quel tipo sono senza blocco.Se il valore della macro è zero, le operazioni sul tipo non sono senza blocco.Se il valore è 1, operazioni possono essere senza blocco e un controllo runtime è obbligatorio.Se il valore è 2, le operazioni sono senza blocco.È possibile utilizzare la funzione atomic_is_lock_free per determinare in fase di esecuzione se le operazioni sui tipi sono senza blocco.
Per ognuno dei tipi integrali, esiste un tipo definito atomico corrispondente denominato che gestisce un oggetto di tale tipo integrale.Ogni tipo atomic_integral ha lo stesso insieme di funzioni membro della creazione di istanza corrispondente atomic<Ty> e può essere passato a qualsiasi atomiche funzioni non membro.
Tipo atomic_integral |
Tipo integrale |
Macro diatomic_is_lock_free |
---|---|---|
atomic_char |
char |
ATOMIC_CHAR_LOCK_FREE |
atomic_schar |
signed char |
ATOMIC_CHAR_LOCK_FREE |
atomic_uchar |
unsigned char |
ATOMIC_CHAR_LOCK_FREE |
atomic_char16_t |
char16_t |
ATOMIC_CHAR16_T_LOCK_FREE |
atomic_char32_t |
char32_t |
ATOMIC_CHAR32_T_LOCK_FREE |
atomic_wchar_t |
wchar_t |
ATOMIC_WCHAR_T_LOCK_FREE |
atomic_short |
short |
ATOMIC_SHORT_LOCK_FREE |
atomic_ushort |
unsigned short |
ATOMIC_SHORT_LOCK_FREE |
atomic_int |
int |
ATOMIC_INT_LOCK_FREE |
atomic_uint |
unsigned int |
ATOMIC_INT_LOCK_FREE |
atomic_long |
long |
ATOMIC_LONG_LOCK_FREE |
atomic_ulong |
unsigned long |
ATOMIC_LONG_LOCK_FREE |
atomic_llong |
long long |
ATOMIC_LLONG_LOCK_FREE |
atomic_ullong |
unsigned long long |
ATOMIC_LLONG_LOCK_FREE |
I nomi di typedef disponibili per le specializzazioni del modello atomico per alcuni tipi definiti nell'intestazione <inttypes.h>.
Tipo atomico |
Nome typedef |
---|---|
atomic_int8_t |
atomic<int8_t> |
atomic_uint8_t |
atomic<uint8_t> |
atomic_int16_t |
atomic<int16_t> |
atomic_uint16_t |
atomic<uint16_t> |
atomic_int32_t |
atomic<int32_t> |
atomic_uint32_t |
atomic<uint32_t> |
atomic_int64_t |
atomic<int64_t> |
atomic_uint64_t |
atomic<uint64_t> |
atomic_int_least8_t |
atomic<int_least8_t> |
atomic_uint_least8_t |
atomic<uint_least8_t> |
atomic_int_least16_t |
atomic<int_least16_t> |
atomic_uint_least16_t |
atomic<uint_least16_t> |
atomic_int_least32_t |
atomic<int_least32_t> |
atomic_uint_least32_t |
atomic<uint_least32_t> |
atomic_int_least64_t |
atomic<int_least64_t> |
atomic_uint_least64_t |
atomic<uint_least64_t> |
atomic_int_fast8_t |
atomic<int_fast8_t> |
atomic_uint_fast8_t |
atomic<uint_fast8_t> |
atomic_int_fast16_t |
atomic<int_fast16_t> |
atomic_uint_fast16_ |
atomic<uint_fast16_t> |
atomic_int_fast32_t |
atomic<int_fast32_t> |
atomic_uint_fast32_t |
atomic<uint_fast32_t> |
atomic_int_fast64_t |
atomic<int_fast64_t> |
atomic_uint_fast64_t |
atomic<uint_fast64_t> |
atomic_intptr_t |
atomic<intptr_t> |
atomic_uintptr_t |
atomic<uintptr_t> |
atomic_size_t |
atomic<size_t> |
atomic_ptrdiff_t |
atomic<ptrdiff_t> |
atomic_intmax_t |
atomic<intmax_t> |
atomic_uintmax_t |
atomic<uintmax_t> |
Strutture
Nome |
Descrizione |
---|---|
Viene descritto un oggetto che esegue le operazioni atomiche su un valore memorizzato. |
|
Vengono descritti un oggetto e set atomico e rimuovere un flag bool. |
Enumerazioni
Nome |
Descrizione |
---|---|
Fornisce nomi simbolici per le operazioni di sincronizzazione alle posizioni di memoria.Queste operazioni influiscono sulle assegnazioni in un thread visualizzati in un altro. |
Funzioni
Nell'elenco, le funzioni che non terminano in _explicit le dispongono di semantica _explicitcorrispondente, ma con gli argomenti impliciti memory_ordermemory_order_seq_cst.
Nome |
Descrizione |
---|---|
Esegue un confronto in modalità atomica e scambio l'operazione. |
|
Esegue un confronto in modalità atomica e scambio l'operazione. |
|
Esegue un confronto atomico debole e scambio l'operazione. |
|
Esegue un confronto atomico debole e scambio l'operazione. |
|
Sostituisce un valore memorizzato. |
|
Sostituisce un valore memorizzato. |
|
Aggiunge un valore specificato con un valore archiviato esistente. |
|
Aggiunge un valore specificato con un valore archiviato esistente. |
|
Esegue and bit per bit su un determinato valore e un valore archiviato esistente. |
|
Esegue and bit per bit su un determinato valore e un valore archiviato esistente. |
|
Esegue or bit per bit su un determinato valore e un valore archiviato esistente. |
|
Esegue or bit per bit su un determinato valore e un valore archiviato esistente. |
|
Sottrae un valore specificato da un valore archiviato esistente. |
|
Sottrae un valore specificato da un valore archiviato esistente. |
|
Esegue exclusive or bit per bit su un determinato valore e un valore archiviato esistente. |
|
Esegue exclusive or bit per bit su un determinato valore e un valore archiviato esistente. |
|
Imposta il flag in un oggetto atomic_flag a false. |
|
Imposta il flag in un oggetto atomic_flag a false. |
|
Imposta il flag in un oggetto atomic_flag a true. |
|
Imposta il flag in un oggetto atomic_flag a true. |
|
Imposta il valore memorizzato in un oggetto atomic. |
|
Specifica se le operazioni atomiche in un oggetto specificato sono senza blocco. |
|
Seguito viene recuperato un valore. |
|
Seguito viene recuperato un valore. |
|
Funge da recinto che stabilisce i requisiti dell'ordine di memoria tra recinta un thread chiamante con gestori del segnale eseguito nello stesso thread. |
|
Seguito memorizza un valore. |
|
Seguito memorizza un valore. |
|
Funge da recinto che stabilisce i requisiti dell'ordine di memoria rispetto ad altri recinti. |
|
Interrompe una catena possibile di dipendenza. |