<atomic>
Define classes e modelos de classe para usar para criar tipos que dão suporte a operações atômicas.
Sintaxe
#include <atomic>
Comentários
Observação
Em código compilado usando /clr:pure
, esse cabeçalho é bloqueado. /clr:pure
e /clr:safe
são preteridos no Visual Studio 2017 e versões posteriores.
Uma operação atômica tem duas propriedades-chave que ajudarão você a usar vários threads para manipular um objeto corretamente sem usar bloqueios mutex
.
Como uma operação atômica é indivisível, uma segunda operação atômica no mesmo objeto de um thread diferente pode obter o estado do objeto apenas antes ou depois da primeira operação atômica.
Com base em seu argumento
memory_order
, uma operação atômica estabelece os requisitos de ordenação para a visibilidade dos efeitos de outras operações atômicas no mesmo thread. Consequentemente, inibe a otimizações do compilador que violam os requisitos de ordenação.
Em algumas plataformas, pode não ser possível implementar operações atômicas com eficiência para alguns tipos sem usar bloqueios mutex
. Um tipo atômico será lock-free
se nenhuma operação atômica no tipo usar bloqueios.
C++11
: em manipuladores de sinal, você pode executar operações atômicas em um objeto obj
se obj.is_lock_free()
ou atomic_is_lock_free(x)
são true
.
A classe atomic_flag
fornece um tipo atômico mínimo que contém um sinalizador bool
. Suas operações são sempre livres de bloqueio.
A classe de modelo atomic<T>
armazena um objeto de seu tipo de argumento T
e fornece acesso atômico para o valor armazenado. Você pode instanciá-la usando qualquer tipo que possa ser copiado usando memcpy
e testada quanto à igualdade usando memcmp
. Em particular, você pode usá-la com tipos definidos pelo usuário que atendam a esses requisitos e, em muitos casos, os tipos de ponto flutuante.
O modelo também tem um conjunto de especializações para tipos integrais e uma especialização parcial de ponteiros. Essas especializações fornecem operações adicionais que não estão disponíveis por meio do modelo primário.
Especializações do ponteiro
As especializações parciais atomic<T *>
se aplicam a todos os tipos de ponteiro. Elas fornecem métodos para aritmética de ponteiro.
Especializações integrais
As especializações atomic<integral>
aplicam-se a todos os tipos integrais. Elas fornecem operações adicionais que não estão disponíveis por meio do modelo primário.
Cada tipo atomic<integral>
tem uma macro correspondente que você pode usar em um if directive
para determinar no tempo de compilação se operações desse tipo estão livres de bloqueio. Se o valor da macro for zero, operações do tipo não serão livres de bloqueio. Se o valor for 1, as operações podem ser livres de bloqueio e uma verificação de runtime será necessária. Se o valor for 2, as operações serão livres de bloqueio. Você pode usar a função atomic_is_lock_free
para determinar no runtime se as operações no tipo são livres de bloqueio.
Para cada um dos tipos integrais, há um tipo atômico nomeado correspondente que gerencia um objeto desse tipo integral. Cada tipo atomic_integral
tem o mesmo conjunto de funções membro que a instanciação correspondente de atomic<T>
e pode ser passado para qualquer uma das funções atômicas não membro.
Tipo atomic_integral |
Tipo integral | Macro atomic_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 |
Os nomes Typedef
existem para especializações do modelo atômico para alguns dos tipos definidos no cabeçalho <inttypes.h>
.
Tipo Atômico | 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> |
Estruturas
Nome | Descrição |
---|---|
Estrutura atomic |
Descreve um objeto que executa operações atomic em um valor armazenado. |
Estrutura atomic_flag |
Descreve um objeto que define e limpa atomicamente um sinalizador bool . |
Enumerações
Nome | Descrição |
---|---|
Enum memory_order |
Fornece nomes simbólicos para operações de sincronização em locais na memória. Essas operações afetam como atribuições em um thread se tornam visíveis em outro. |
Funções
Na lista a seguir, as funções que não terminam em _explicit
têm a semântica do _explicit
correspondente, exceto que têm argumentos memory_order
implícitos de memory_order_seq_cst
.
Nome | Descrição |
---|---|
atomic_compare_exchange_strong |
Executa uma operação atomic compare and exchange . |
atomic_compare_exchange_strong_explicit |
Executa uma operação atomic compare and exchange . |
atomic_compare_exchange_weak |
Executa uma operação de weak atomic compare and exchange . |
atomic_compare_exchange_weak_explicit |
Executa uma operação de weak atomic compare and exchange . |
atomic_exchange |
Substitui um valor armazenado. |
atomic_exchange_explicit |
Substitui um valor armazenado. |
atomic_fetch_add |
Adiciona um valor especificado a um valor armazenado existente. |
atomic_fetch_add_explicit |
Adiciona um valor especificado a um valor armazenado existente. |
atomic_fetch_and |
Executa um bit a bit "and" (& ) em um valor especificado e um valor armazenado existente. |
atomic_fetch_and_explicit |
Executa um bit a bit "and" (& ) em um valor especificado e um valor armazenado existente. |
atomic_fetch_or |
Executa um bit a bit "or" (| ) em um valor especificado e um valor armazenado existente. |
atomic_fetch_or_explicit |
Executa um bit a bit "or" (| ) em um valor especificado e um valor armazenado existente. |
atomic_fetch_sub |
Subtrai um valor especificado de um valor armazenado existente. |
atomic_fetch_sub_explicit |
Subtrai um valor especificado de um valor armazenado existente. |
atomic_fetch_xor |
Executa um bit a bit "exclusive or" (^ ) em um valor especificado e um valor armazenado existente. |
atomic_fetch_xor_explicit |
Executa um bit a bit "exclusive or" (^ ) em um valor especificado e um valor armazenado existente. |
atomic_flag_clear |
Define o sinalizador em um objeto atomic_flag como false . |
atomic_flag_clear_explicit |
Define o sinalizador em um objeto atomic_flag como false . |
atomic_flag_test_and_set |
Define o sinalizador em um objeto atomic_flag como true . |
atomic_flag_test_and_set_explicit |
Define o sinalizador em um objeto atomic_flag como true . |
atomic_init |
Define o valor armazenado em um objeto atomic . |
atomic_is_lock_free |
Especifica se operações atômicas em um objeto especificado estão livres de bloqueio. |
atomic_load |
Recupera um valor atomicamente. |
atomic_load_explicit |
Recupera um valor atomicamente. |
atomic_signal_fence |
Atua como um fence que estabelece os requisitos de ordenação de memória entre limites em um thread de chamada que tem manipuladores de sinal executados no mesmo thread. |
atomic_store |
Armazena um valor atomicamente. |
atomic_store_explicit |
Armazena um valor atomicamente. |
atomic_thread_fence |
Atua como um fence que estabelece os requisitos de ordenação de memória em relação a outros limites. |
kill_dependency |
Divide uma cadeia de dependências possível. |
Confira também
Referência de Arquivos de Cabeçalho
Referência da biblioteca padrão C++