Nota
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare ad accedere o a cambiare directory.
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare a cambiare directory.
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_orderargomento, 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++