Condividi tramite


<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 Enum 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++