Compartilhar via


<atomic>

Define classes e classes de modelo para usar o para criar os tipos que dão suporte a operações atômicas.

#include <atomic>

Comentários

Dica

No código que é construído usando /clr ou /clr:pure, este cabeçalho é bloqueado.

Uma operação atômica tem duas propriedades de chave que o ajudam a usar vários threads para manipular corretamente um objeto sem usar bloqueios de 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 de memory_order , uma operação atômica estabelece a ordenação requisitos para a visibilidade dos efeitos de outras operações atômicas no mesmo thread. Consequentemente, inibe otimizações de compilador que violam os requisitos de solicitação.

Em algumas plataformas, talvez não seja possível implementar operações com eficiência atômicas para alguns tipos sem usar bloqueios de mutex . Um tipo atômico é lock-partition-id&gt livre se nenhuma operação atômica nesse uso do tipo bloqueios.

A classe atomic_flag fornece um tipo atômico mínimo que contém um sinalizador de bool . As operações são sempre lock-partition-id&gt livres.

A classe atomic<Ty> do modelo armazena um objeto do tipo Ty de argumento e fornece acesso ao do valor atômico armazenado. Você pode criar-lo uma instância do com qualquer tipo que possa ser copiado usando memcpy e ser testado para igualdade usando memcmp. Em particular, você pode usá-lo com tipos definidos pelo usuário que satisfazem esses requisitos e, em muitos casos, com tipos de ponto flutuante.

O modelo também tem um conjunto de especializações para tipos integral e de uma especialização parcial para ponteiros. Essas especializações fornecem as operações adicionais que não estão disponíveis no modelo primário.

Especializações do ponteiro

As especializações parciais de atomic<Ty *> se aplicam a todos os tipos de ponteiro. Fornece métodos para aritmética do ponteiro.

Especializações integrais

As especializações de atomic<integral> se aplicam a todos os tipos integrais. Fornece as operações adicionais que não estão disponíveis no modelo primário.

Cada tipo de atomic<integral> tem uma macro correspondente que você pode usar em if directive para determinar em tempo de compilação se as operações desse tipo são lock-partition-id&gt livres. Se o valor de macro é zero, as operações do tipo não são lock-partition-id&gt livres. Se o valor for 1, as operações poderão ser lock-partition-id&gt livres, e uma verificação de tempo de execução é necessária. Se o valor for 2, as operações são lock-partition-id&gt livres. Você pode usar a função atomic_is_lock_free para determinar o tempo de execução se as operações do tipo são lock-partition-id&gt livres.

Para cada um dos tipos integrais, há um tipo atômico nomeado correspondentes que gerencia um objeto desse tipo integral. Cada tipo de atomic_integral tem o mesmo conjunto de funções de membro que a instanciação correspondente de atomic<Ty> e pode ser passado para qualquer uma das funções de membro não atômicas.

tipo deatomic_integral

Tipo integral

macro deatomic_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 de Typedef existem para especializações do modelo atômico para alguns dos tipos definidos no cabeçalho <inttypes.h.>

Tipo atômico

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

Structs

Nome

Descrição

Estrutura atomic

Descreve um objeto que executa operações atômicas em um valor armazenado.

Estrutura atomic_flag

Descreve um objeto que define e limpa atomicamente um sinalizador de bool.

Enum

Nome

Descrição

Enum memory_order

Fornece nomes simbólicos para operações de sincronização em locais de memória. Essas operações afetam como as 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-nas a semântica de _explicitcorrespondente, exceto que têm os argumentos implícitos de memory_order de memory_order_seq_cst.

Nome

Descrição

Função atomic_compare_exchange_strong

Executa uma operação atômica de comparação e troca.

Função atomic_compare_exchange_strong_explicit

Executa uma operação atômica de comparação e troca.

Função atomic_compare_exchange_weak

Executa uma operação fraca atômica de comparação e troca.

Função atomic_compare_exchange_weak_explicit

Executa uma operação fraca atômica de comparação e troca.

Função atomic_exchange

Substitui um valor armazenado.

Função atomic_exchange_explicit

Substitui um valor armazenado.

Função atomic_fetch_add

Adiciona um valor especificado para um valor armazenado existente.

Função atomic_fetch_add_explicit

Adiciona um valor especificado para um valor armazenado existente.

Função atomic_fetch_and

Executa and bit a bit em um valor especificado e um valor armazenado existente.

Função atomic_fetch_and_explicit

Executa and bit a bit em um valor especificado e um valor armazenado existente.

Função atomic_fetch_or

Executa or bit a bit em um valor especificado e um valor armazenado existente.

Função atomic_fetch_or_explicit

Executa or bit a bit em um valor especificado e um valor armazenado existente.

Função atomic_fetch_sub

Subtrai um valor especificado de um valor armazenado existente.

Função atomic_fetch_sub_explicit

Subtrai um valor especificado de um valor armazenado existente.

Função atomic_fetch_xor

Executa exclusive or bit a bit em um valor especificado e um valor armazenado existente.

Função atomic_fetch_xor_explicit

Executa exclusive or bit a bit em um valor especificado e um valor armazenado existente.

Função atomic_flag_clear

Define o sinalizador em um objeto de atomic_flag a false.

Função atomic_flag_clear_explicit

Define o sinalizador em um objeto de atomic_flag a false.

Função atomic_flag_test_and_set

Define o sinalizador em um objeto de atomic_flag a true.

Função atomic_flag_test_and_set_explicit

Define o sinalizador em um objeto de atomic_flag a true.

Função atomic_init

Define o valor armazenado em um objeto de atomic .

Função atomic_is_lock_free

Especifica se as operações atômicas em um objeto especificado são lock-partition-id&gt livres.

Função atomic_load

Recupera um valor atômico.

Função atomic_load_explicit

Recupera um valor atômico.

Função atomic_signal_fence

Atua como uma cerca que estabelece a memória que os requisitos entre cercas em um thread de chamada que tem os manipuladores de sinal executados no mesmo thread.

Função atomic_store

Armazena um valor atômico.

Função atomic_store_explicit

Armazena um valor atômico.

Função atomic_thread_fence

Atua como uma cerca que estabelece a memória que os requisitos em relação a outras cercas.

Função kill_dependency

Interrompe a cadeia possível de dependência.

Consulte também

Referência

Biblioteca de Modelos Padrão

Outros recursos

Arquivos de cabeçalho da Biblioteca Padrão C++