<atomic>
Definisce classi e modelli di classe da usare per creare tipi che supportano operazioni atomiche.
Sintassi
#include <atomic>
Osservazioni:
Nota
Nel codice compilato tramite /clr:pure
, questa intestazione è bloccata. Sia /clr:pure
che /clr:safe
sono deprecati in Visual Studio 2017 e versioni successive.
Un'operazione atomica ha due proprietà chiave che consentono di usare più thread per modificare correttamente un oggetto senza usare mutex
blocchi.
Poiché un'operazione atomica è indivisibile, una seconda operazione atomica sullo stesso oggetto da un thread diverso può ottenere lo stato dell'oggetto solo prima o dopo la prima operazione atomica.
In base al relativo
memory_order
argomento, un'operazione atomica stabilisce i requisiti di ordinamento per la visibilità degli effetti di altre operazioni atomiche nello stesso thread. Di conseguenza, impedisce le ottimizzazioni del compilatore che violano i requisiti di ordinamento.
In alcune piattaforme, potrebbe non essere possibile implementare in modo efficiente operazioni atomiche per alcuni tipi senza usare blocchi mutex
. Un tipo atomico è lock-free
se nessuna operazione atomica su quel tipo usa blocchi.
C++11
: nei gestori di segnale è possibile eseguire operazioni atomiche su un oggetto obj
se obj.is_lock_free()
o atomic_is_lock_free(x)
sono true
.
La classe atomic_flag
fornisce un tipo atomico minimo che contiene un bool
flag. Le operazioni sono sempre senza blocco.
Il modello atomic<T>
di classe archivia un oggetto del tipo di T
argomento e fornisce l'accesso atomico a tale valore archiviato. È possibile crearne un'istanza usando qualsiasi tipo che può essere copiato usando memcpy
e testato l'uguaglianza usando memcmp
. In particolare, è possibile usare la classe con tipi definiti dall'utente che soddisfano tali requisiti e, in molti casi, con tipi a virgola mobile.
Il modello include anche un set di specializzazioni per i tipi integrali e una specializzazione parziale per i puntatori. Queste specializzazioni forniscono operazioni aggiuntive che non sono disponibili tramite il modello primario.
Specializzazioni dei puntatori
Le specializzazioni parziali atomic<T *>
si applicano a tutti i tipi di puntatore. Forniscono metodi per l'aritmetica dei puntatori.
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>
ha una macro corrispondente che è possibile usare in una if directive
per determinare in fase di compilazione se le operazioni su tale tipo sono senza blocco. Se il valore della macro è zero, le operazioni sul tipo non sono senza blocco. Se il valore è 1, le operazioni potrebbero essere senza blocco ed è necessario un controllo di runtime. Se il valore è 2, le operazioni sono senza blocco. È possibile usare la funzione atomic_is_lock_free
per determinare in fase di esecuzione se le operazioni sul tipo sono senza blocco.
Per ognuno dei tipi integrali, è presente un tipo atomico denominato corrispondente che gestisce un oggetto di quel tipo integrale. Ogni tipo atomic_integral
ha lo stesso set di funzioni membro dell'istanza corrispondente di atomic<T>
e può essere passato a qualsiasi funzione atomica non membro.
Tipo di atomic_integral |
Tipo integrale | atomic_is_lock_free Macro |
---|---|---|
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 |
Typedef
Esistono nomi per le specializzazioni del modello atomico per alcuni dei tipi definiti nell'intestazione <inttypes.h>
.
Tipo atomico | Typedef Name |
---|---|
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> |
Struct
Nome | Descrizione |
---|---|
atomic Struttura |
Descrive un oggetto che esegue atomic operazioni su un valore archiviato. |
atomic_flag Struttura |
Descrive un oggetto che imposta e rimuove atomicamente un flag bool . |
Enumerazioni
Nome | Descrizione |
---|---|
memory_order Enumerazione |
Fornisce nomi simbolici per le operazioni di sincronizzazione sulle posizioni di memoria. Queste operazioni influiscono sul modo in cui gli assegnamenti in un thread diventano visibili in un altro. |
Funzioni
Nell'elenco seguente le funzioni che non terminano _explicit
hanno la semantica dell'oggetto corrispondente _explicit
, ad eccezione del fatto che hanno gli argomenti impliciti memory_order
di memory_order_seq_cst
.
Nome | Descrizione |
---|---|
atomic_compare_exchange_strong |
Esegue un'operazione atomic compare and exchange . |
atomic_compare_exchange_strong_explicit |
Esegue un'operazione atomic compare and exchange . |
atomic_compare_exchange_weak |
Esegue un'operazione weak atomic compare and exchange . |
atomic_compare_exchange_weak_explicit |
Esegue un'operazione weak atomic compare and exchange . |
atomic_exchange |
Sostituisce un valore archiviato. |
atomic_exchange_explicit |
Sostituisce un valore archiviato. |
atomic_fetch_add |
Aggiunge un valore specificato a un valore archiviato esistente. |
atomic_fetch_add_explicit |
Aggiunge un valore specificato a un valore archiviato esistente. |
atomic_fetch_and |
Esegue un "and" bit per bit (& ) su un valore specificato e un valore archiviato esistente. |
atomic_fetch_and_explicit |
Esegue un "and" bit per bit (& ) su un valore specificato e un valore archiviato esistente. |
atomic_fetch_or |
Esegue un "or" bit per bit (| ) su un valore specificato e un valore archiviato esistente. |
atomic_fetch_or_explicit |
Esegue un "or" bit per bit (| ) su un valore specificato e un valore archiviato esistente. |
atomic_fetch_sub |
Sottrae un valore specificato da un valore archiviato esistente. |
atomic_fetch_sub_explicit |
Sottrae un valore specificato da un valore archiviato esistente. |
atomic_fetch_xor |
Esegue un bit per bit "esclusivo o" (^ ) su un valore specificato e un valore archiviato esistente. |
atomic_fetch_xor_explicit |
Esegue un bit per bit "esclusivo o" (^ ) su un valore specificato e un valore archiviato esistente. |
atomic_flag_clear |
Imposta il flag in un oggetto atomic_flag su false . |
atomic_flag_clear_explicit |
Imposta il flag in un oggetto atomic_flag su false . |
atomic_flag_test_and_set |
Imposta il flag in un oggetto atomic_flag su true . |
atomic_flag_test_and_set_explicit |
Imposta il flag in un oggetto atomic_flag su true . |
atomic_init |
Imposta il valore archiviato in un oggetto atomic . |
atomic_is_lock_free |
Specifica se le operazioni atomiche in un oggetto specificato sono senza blocco. |
atomic_load |
Recupera un valore in modo atomico. |
atomic_load_explicit |
Recupera un valore in modo atomico. |
atomic_signal_fence |
Funge da oggetto fence che stabilisce i requisiti di ordinamento della memoria tra i limiti in un thread chiamante con gestori di segnale eseguiti nello stesso thread. |
atomic_store |
Archivia un valore in modo atomico. |
atomic_store_explicit |
Archivia un valore in modo atomico. |
atomic_thread_fence |
Funge da oggetto fence che stabilisce i requisiti di ordinamento della memoria rispetto ad altri recinti. |
kill_dependency |
Interrompe una possibile catena delle dipendenze. |
Vedi anche
Riferimento file di intestazione
Informazioni di riferimento per la libreria standard C++