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

struttura atomica

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

struttura di atomic_flag

Vengono descritti un oggetto e set atomico e rimuovere un flag bool.

Enumerazioni

Nome

Descrizione

memory_order Enum

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

funzione atomic_compare_exchange_strong

Esegue un confronto in modalità atomica e scambio l'operazione.

funzione atomic_compare_exchange_strong_explicit

Esegue un confronto in modalità atomica e scambio l'operazione.

funzione atomic_compare_exchange_weak

Esegue un confronto atomico debole e scambio l'operazione.

funzione atomic_compare_exchange_weak_explicit

Esegue un confronto atomico debole e scambio l'operazione.

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 determinato valore e un valore archiviato esistente.

funzione atomic_fetch_and_explicit

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

Funzione atomic_fetch_or

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

funzione atomic_fetch_or_explicit

Esegue or bit per bit su un determinato valore 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 determinato valore e un valore archiviato esistente.

funzione atomic_fetch_xor_explicit

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

funzione atomic_flag_clear

Imposta il flag in un oggetto atomic_flag a false.

funzione atomic_flag_clear_explicit

Imposta il flag in un oggetto atomic_flag a false.

funzione atomic_flag_test_and_set

Imposta il flag in un oggetto atomic_flag a true.

funzione atomic_flag_test_and_set_explicit

Imposta il flag in un oggetto atomic_flag a true.

funzione atomic_init

Imposta il valore memorizzato in un oggetto atomic.

Funzione atomic_is_lock_free

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

funzione atomic_load

Seguito viene recuperato un valore.

funzione atomic_load_explicit

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

Seguito memorizza un valore.

funzione atomic_store_explicit

Seguito memorizza 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