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