Condividi tramite


<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 dispone di 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 è indivisibile, un'altra operazione atomica sullo stesso oggetto da un thread diverso possibile ottenere lo stato dell'oggetto solo prima o dopo la prima operazione atomica.

  • In base all'argomento di 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 implementare in modo efficiente le operazioni atomiche per alcuni tipi senza l'utilizzo di blocchi di mutex. Un tipo è atomico senza blocco se nessun operazioni atomiche i blocchi dell'utilizzo del tipo.

La classe atomic_flag fornisce un tipo atomico minimo che utilizza un flag di bool. Le operazioni sono sempre senza blocco.

La classe modello atomic<Ty> archivia un oggetto del tipo di argomento Ty e consente di accedere atomico al 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 del puntatore

Le specializzazioni parziali di atomic<Ty *> si applicano a tutti i tipi di puntatore. Fornisce metodi per operazioni aritmetiche.

Specializzazioni integrali

Le specializzazioni di atomic<integral> si applicano a tutti i tipi integrali. Forniscono operazioni aggiuntive che non sono disponibili tramite il modello primario.

Ogni tipo di 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 nel tipo non sono senza blocco. Se il valore è 1, le operazioni potrebbero 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 denominato atomico corrispondente che gestisce un oggetto di tale tipo integrale. Ogni tipo di atomic_integral ha lo stesso insieme di funzioni membro della creazione di istanza corrispondente di 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

Struttura atomic

Viene descritto un oggetto che esegue le operazioni atomiche su un valore memorizzato.

Struttura atomic_flag

Viene descritto un oggetto che imposta e rimuove atomicamente un flag bool.

Enumerazioni

Nome

Descrizione

Enumerazione memory_order

Fornisce i nomi simbolici per le operazioni di sincronizzazione sulle locazioni di memoria. Queste operazioni influiscono su come gli assegnamenti in un thread diventino visibili in un altro.

Funzioni

Nell'elenco, le funzioni che non terminano nelle _explicit dispongono di semantica di _explicitcorrispondente, ad eccezione del fatto che hanno gli argomenti impliciti di memory_order di memory_order_seq_cst.

Nome

Descrizione

Funzione atomic_compare_exchange_strong

Esegue un'operazione di confronto e scambio atomico.

Funzione atomic_compare_exchange_strong_explicit

Esegue un'operazione di confronto e scambio atomico.

Funzione atomic_compare_exchange_weak

Esegue un'operazione di confronto e scambio atomico debole.

Funzione atomic_compare_exchange_weak_explicit

Esegue un'operazione di confronto e scambio atomico debole.

Funzione atomic_exchange

Sostituisce un valore memorizzato.

Funzione atomic_exchange_explicit

Sostituisce un valore memorizzato.

Funzione atomic_fetch_add

Aggiunge un valore specificato con un valore archiviato esistente.

Funzione atomic_fetch_add_explicit

Aggiunge un valore specificato con un valore archiviato esistente.

Funzione atomic_fetch_and

Esegue and bit per bit su un valore specificato e un valore archiviato esistente.

Funzione atomic_fetch_and_explicit

Esegue and bit per bit su un valore specificato e un valore archiviato esistente.

Funzione atomic_fetch_or

Esegue or bit per bit su un valore specificato e un valore archiviato esistente.

Funzione atomic_fetch_or_explicit

Esegue or bit per bit su un valore specificato e un valore archiviato esistente.

Funzione atomic_fetch_sub

Sottrae un valore specificato da un valore archiviato esistente.

Funzione atomic_fetch_sub_explicit

Sottrae un valore specificato da un valore archiviato esistente.

Funzione atomic_fetch_xor

Esegue exclusive or bit per bit su un valore specificato e un valore archiviato esistente.

Funzione atomic_fetch_xor_explicit

Esegue exclusive or bit per bit su un valore specificato e un valore archiviato esistente.

Funzione atomic_flag_clear

Imposta il flag di un oggetto di atomic_flag a false.

Funzione atomic_flag_clear_explicit

Imposta il flag di un oggetto di atomic_flag a false.

Funzione atomic_flag_test_and_set

Imposta il flag di un oggetto di atomic_flag a true.

Funzione atomic_flag_test_and_set_explicit

Imposta il flag di un oggetto di atomic_flag a true.

Funzione atomic_init

Imposta il valore memorizzato in un oggetto di atomic.

Funzione atomic_is_lock_free

Specifica se le operazioni atomiche in un oggetto specificato sono senza blocco.

Funzione atomic_load

Di seguito viene recuperato un valore.

Funzione atomic_load_explicit

Di seguito viene recuperato un valore.

Funzione atomic_signal_fence

Funge da recinto che stabilisce i requisiti dell'ordine di memoria tra recinta un thread chiamante con gestori del segnale eseguito nello stesso thread.

Funzione atomic_store

Atomico archivia un valore.

Funzione atomic_store_explicit

Atomico archivia un valore.

Funzione atomic_thread_fence

Funge da recinto che stabilisce i requisiti dell'ordine di memoria rispetto ad altri recinti.

Funzione kill_dependency

Interrompe una catena possibile di dipendenza.

Vedere anche

Riferimenti

Libreria di modelli standard

Altre risorse

File di intestazione libreria standard C++