Funções <atomic>

atomic_compare_exchange_strong
atomic_compare_exchange_strong_explicit
atomic_compare_exchange_weak
atomic_compare_exchange_weak_explicit
atomic_exchange
atomic_exchange_explicit
atomic_fetch_add
atomic_fetch_add_explicit
atomic_fetch_and
atomic_fetch_and_explicit
atomic_fetch_or
atomic_fetch_or_explicit
atomic_fetch_sub
atomic_fetch_sub_explicit
atomic_fetch_xor
atomic_fetch_xor_explicit
atomic_flag_clear
atomic_flag_clear_explicit
atomic_flag_test_and_set
atomic_flag_test_and_set_explicit
atomic_init
atomic_is_lock_free
atomic_load
atomic_load_explicit
atomic_signal_fence
atomic_store
atomic_store_explicit
atomic_thread_fence
kill_dependency

atomic_compare_exchange_strong

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

template <class Ty>
inline bool atomic_compare_exchange_strong(
    volatile atomic<Ty>* Atom,
    Ty* Exp,
    Value) noexcept;

template <class Ty>
inline bool atomic_compare_exchange_strong(
    atomic<Ty>* Atom,
    Ty* Exp,
    Ty Value) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que armazena um valor do tipo Ty.

Exp
Um ponteiro para um valor do tipo Ty.

Value
Um valor do tipo Ty.

Valor de retorno

true se os valores forem iguais. Caso contrário, false.

Comentários

Esse método executa uma operação de comparação e troca atômica usando argumentos memory_order.memory_order_seq_cst implícitos. Para obter mais informações, consulte atomic_compare_exchange_strong_explicit.

atomic_compare_exchange_strong_explicit

Executa uma operação atomic compare and exchange.

template <class T>
inline bool atomic_compare_exchange_strong_explicit(
    volatile atomic<Ty>* Atom,
    Ty* Exp,
    Ty Value,
    memory_order Order1,
    memory_order Order2) noexcept;

template <class Ty>
inline bool atomic_compare_exchange_strong_explicit(
    atomic<Ty>* Atom,
    Ty* Exp,
    Ty Value,
    memory_order Order1,
    memory_order Order2) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que armazena um valor do tipo Ty.

Exp
Um ponteiro para um valor do tipo Ty.

Value
Um valor do tipo Ty.

Order1
Primeiro argumento memory_order.

Order2
Segundo argumento memory_order. O valor de Order2 não pode ser memory_order_release ou memory_order_acq_rel, ele não pode ser maior que o valor de Order1.

Valor de retorno

true se os valores forem iguais. Caso contrário, false.

Comentários

Um atomic compare and exchange operation compara o valor que é armazenado no objeto que é apontado pelo Atom com o valor que é apontado pelo Exp. Se os valores forem iguais, o valor armazenado no objeto que é apontado pelo Atom será substituído por Value usando uma operação de leitura, alteração e gravação e aplicando as restrições de ordem de memória especificadas pelo Order1. Se os valores não forem iguais, a operação substituirá o valor apontado por Exp pelo valor armazenado no objeto apontado por Atom e aplicará as restrições de ordem de memória especificadas por Order2.

atomic_compare_exchange_weak

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

template <class Ty>
inline bool atomic_compare_exchange_strong(
    volatile atomic<Ty>* Atom,
    Ty* Exp,
    Ty Value) noexcept;

template <class Ty>
inline bool atomic_compare_exchange_strong(
    atomic<Ty>* Atom,
    Ty* Exp,
    Ty Value) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que armazena um valor do tipo Ty.

Exp
Um ponteiro para um valor do tipo Ty.

Value
Um valor do tipo Ty.

Valor de retorno

true se os valores forem iguais. Caso contrário, false.

Comentários

Esse método executa uma operação de comparar e trocar atômica fraca que tem argumentos memory_order.memory_order_seq_cst implícitos. Para obter mais informações, consulte atomic_compare_exchange_weak_explicit.

atomic_compare_exchange_weak_explicit

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

template <class Ty>
inline bool atomic_compare_exchange_weak_explicit(
    volatile atomic<Ty>* Atom,
    Ty* Exp,
    Ty Value,
    memory_order Order1,
    memory_order Order2) noexcept;

template <class Ty>
inline bool atomic_compare_exchange_weak_explicit(
    atomic<Ty>* Atom,
    Ty* Exp,
    Ty Value,
    memory_order Order1,
    memory_order Order2) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que armazena um valor do tipo Ty.

Exp
Um ponteiro para um valor do tipo Ty.

Value
Um valor do tipo Ty.

Order1
Primeiro argumento memory_order.

Order2
Segundo argumento memory_order. O valor de Order2 não pode ser memory_order_release ou memory_order_acq_rel, nem pode ser maior que o valor de Order1.

Valor de retorno

true se os valores forem iguais. Caso contrário, false.

Comentários

As variantes forte e fraca de um atomic compare and exchange operation garantem que eles não armazenam o novo valor se os valores esperados e atuais não são iguais. A variante forte garante que eles armazenarão o novo valor se os valores esperados e atuais forem iguais. Às vezes, a variante fraca poderá retornar false e não armazenará o novo valor, mesmo que os valores atuais e esperados forem iguais. Ou seja, a função retornará false, mas um exame posterior do valor esperado poderá revelar que ele não foi alterado e, portanto, deve ter sido comparado como igual.

atomic_exchange

Usa Value para substituir o valor armazenado de Atom.

template <class T>
inline Ty atomic_exchange(volatile atomic<Ty>* _Atom, Ty Value) noexcept;

template <class Ty>
inline T atomic_exchange(atomic<Ty>* Atom, Ty Value) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que armazena um valor do tipo Ty.

Value
Um valor do tipo Ty.

Valor de retorno

O valor armazenado de Atom antes da troca.

Comentários

A função atomic_exchange executa uma operação de leitura, alteração e gravação para trocar o valor armazenado em Atom por Value, usando memory_order.memory_order_seq_cst.

atomic_exchange_explicit

Substitui o valor armazenado de Atom por Value.

template <class Ty>
inline Ty atomic_exchange_explicit(
    volatile atomic<Ty>* Atom,
    Ty Value,
    memory_order Order) noexcept;

template <class Ty>
inline Ty atomic_exchange_explicit(
    atomic<Ty>* Atom,
    Ty Value,
    memory_order Order) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que armazena um valor do tipo Ty.

Value
Um valor do tipo Ty.

Order
Um memory_order.

Valor de retorno

O valor armazenado de Atom antes da troca.

Comentários

A função atomic_exchange_explicit executa uma operação de leitura, alteração e gravação para trocar o valor armazenado em Atom com Value, dentro das restrições de memória especificadas por Order.

atomic_fetch_add

Adiciona um valor a um valor existente que é armazenado em um objeto atomic.

template <class T>
T* atomic_fetch_add(volatile atomic<T*>* Atom, ptrdiff_t Value) noexcept;
template <class T>
T* atomic_fetch_add(atomic<T*>* Atom, ptrdiff_t Value) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que armazena um ponteiro para o tipo T.

Value
Um valor do tipo ptrdiff_t.

Valor de retorno

O valor do ponteiro contido pelo objeto atomic imediatamente antes de a operação ter sido executada.

Comentários

A função atomic_fetch_add executa uma operação de leitura, alteração e gravação para adicionar atomicamente Value com o valor armazenado em Atom usando a restrição memory_order.memory_order_seq_cst.

Quando o tipo atômico é atomic_address, Value tem tipo ptrdiff_t e a operação trata o ponteiro armazenado como um char *.

Essa operação também está sobrecarregada para tipos integrais:

integral atomic_fetch_add(volatile atomic-integral* Atom, integral Value) noexcept;

integral atomic_fetch_add(atomic-integral* Atom, integral Value) noexcept;

atomic_fetch_add_explicit

Adiciona um valor a um valor existente que é armazenado em um objeto atomic.

template <class T>
T* atomic_fetch_add_explicit(
    volatile atomic<T*>* Atom,
    ptrdiff_t Value,
    memory_order Order) noexcept;

template <class T>
T* atomic_fetch_add_explicit(
    atomic<T*>* Atom,
    ptrdiff_t Value,
    memory_order Order) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que armazena um ponteiro para o tipo T.

Value
Um valor do tipo ptrdiff_t.

Valor de retorno

O valor do ponteiro contido pelo objeto atomic imediatamente antes de a operação ter sido executada.

Comentários

A função atomic_fetch_add_explicit executa uma operação de leitura, alteração e gravação para adicionar atomicamente Value ao valor armazenado em Atom, dentro das restrições de memory_order especificadas por Order.

Quando o tipo atômico é atomic_address, Value tem tipo ptrdiff_t e a operação trata o ponteiro armazenado como um char *.

Essa operação também está sobrecarregada para tipos integrais:

integral atomic_fetch_add_explicit(
    volatile atomic-integral* Atom,
    integral Value,
    memory_order Order) noexcept;

integral atomic_fetch_add_explicit(
    atomic-integral* Atom,
    integral Value,
    memory_order Order) noexcept;

atomic_fetch_and

Executa um & bit a bit em um valor e um valor existente que é armazenado em um objeto atomic.

template <class T>
inline T atomic_fetch_and(volatile atomic<T>* Atom, T Value) noexcept;
template <class T>
inline T atomic_fetch_and(volatile atomic<T>* Atom, T Value) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que armazena um valor do tipo T.

Value
Um valor do tipo T.

Valor de retorno

O valor contido pelo objeto atomic imediatamente antes de a operação ter sido executada.

Comentários

A função atomic_fetch_and executa uma operação de leitura, alteração e gravação para substituir o valor armazenado de Atom por um & bit a bit de Value e o valor atual armazenado em Atom usando a restrição memory_order.memory_order_seq_cst.

atomic_fetch_and_explicit

Executa um & bit a bit de um valor e um valor existente que é armazenado em um objeto atomic.

template <class T>
inline T atomic_fetch_and_explicit(
    volatile atomic<T>* Atom,
    T Value,
    memory_order Order) noexcept;

template <class T>
inline T atomic_fetch_and_explicit(
    volatile atomic<T>* Atom,
    T Value,
    memory_order Order) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que armazena um valor do tipo T.

Value
Um valor do tipo T.

Order
Um memory_order.

Valor de retorno

O valor contido pelo objeto atomic imediatamente antes de a operação ter sido executada.

Comentários

A função atomic_fetch_and_explicit executa uma operação de leitura, alteração e gravação para substituir o valor armazenado de Atom por um & bit a bit de Value e o valor atual armazenado em Atom, dentro das restrições de memória especificadas por Order.

atomic_fetch_or

Executa um or bit a bit em um valor e um valor existente que é armazenado em um objeto atomic.

template <class T>
inline T atomic_fetch_or (volatile atomic<T>* Atom, T Value) noexcept;
template <class T>
inline T atomic_fetch_or (volatile atomic<T>* Atom, T Value) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que armazena um valor do tipo T.

Value
Um valor do tipo T.

Valor de retorno

O valor contido pelo objeto atomic imediatamente antes de a operação ter sido executada.

Comentários

A função atomic_fetch_or executa uma operação de leitura, alteração e gravação para substituir o valor armazenado de Atom por um or bit a bit de Value e o valor atual armazenado em Atom usando memory_order.memory_order_seq_cst.

atomic_fetch_or_explicit

Executa um or bit a bit em um valor e um valor existente que é armazenado em um objeto atomic.

template <class T>
inline T atomic_fetch_or_explicit(
    volatile atomic<T>* Atom,
    T Value,
    memory_order Order) noexcept;

template <class T>
inline T atomic_fetch_or_explicit(
    volatile atomic<T>* Atom,
    T Value,
    memory_order Order) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que armazena um valor do tipo T.

Value
Um valor do tipo T.

Order
Um memory_order.

Valor de retorno

O valor contido pelo objeto atomic imediatamente antes de a operação ter sido executada.

Comentários

A função atomic_fetch_or_explicit executa uma operação de leitura, alteração e gravação para substituir o valor armazenado de Atom por um or bit a bit de Value e o valor atual armazenado em Atom, dentro das restrições memory_order especificadas por Order.

atomic_fetch_sub

Subtrai um valor de um valor existente que é armazenado em um objeto atomic.

template <class T>
T* atomic_fetch_sub(
    volatile atomic<T*>* Atom,
    ptrdiff_t Value) noexcept;

template <class T>
T* atomic_fetch_sub(
    atomic<T*>* Atom,
    ptrdiff_t Value) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que armazena um ponteiro para o tipo T.

Value
Um valor do tipo ptrdiff_t.

Valor de retorno

O valor do ponteiro contido pelo objeto atomic imediatamente antes de a operação ter sido executada.

Comentários

A função atomic_fetch_sub executa uma operação de leitura, alteração e gravação para subtrair atomicamente Value com o valor armazenado em Atom usando a restrição memory_order.memory_order_seq_cst.

Quando o tipo atômico é atomic_address, Value tem tipo ptrdiff_t e a operação trata o ponteiro armazenado como um char *.

Essa operação também está sobrecarregada para tipos integrais:

integral atomic_fetch_sub(volatile atomic-integral* Atom, integral Value) noexcept;
integral atomic_fetch_sub(atomic-integral* Atom, integral Value) noexcept;

atomic_fetch_sub_explicit

Subtrai um valor de um valor existente que é armazenado em um objeto atomic.

template <class T>
T* atomic_fetch_sub_explicit(
    volatile atomic<T*>* Atom,
    ptrdiff_t Value,
    memory_order Order) noexcept;

template <class T>
T* atomic_fetch_sub_explicit(
    atomic<T*>* Atom,
    ptrdiff_t Value, memory_order Order) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que armazena um ponteiro para o tipo T.

Value
Um valor do tipo ptrdiff_t.

Valor de retorno

O valor do ponteiro contido pelo objeto atomic imediatamente antes de a operação ter sido executada.

Comentários

A função atomic_fetch_sub_explicit executa uma operação de leitura, alteração e gravação para subtrair atomicamente Value ao valor armazenado em Atom, dentro das restrições de memory_order especificadas por Order.

Quando o tipo atômico é atomic_address, Value tem tipo ptrdiff_t e a operação trata o ponteiro armazenado como um char *.

Essa operação também está sobrecarregada para tipos integrais:

integral atomic_fetch_sub_explicit(
    volatile atomic-integral* Atom,
    integral Value,
    memory_order Order) noexcept;

integral atomic_fetch_sub_explicit(
    atomic-integral* Atom,
    integral Value,
    memory_order Order) noexcept;

atomic_fetch_xor

Executa um exclusive or bit a bit em um valor e um valor existente que é armazenado em um objeto atomic.

template <class T>
inline T atomic_fetch_xor(volatile atomic<T>* Atom, T Value) noexcept;

template <class T>
inline T atomic_fetch_xor(volatile atomic<T>* Atom, T Value) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que armazena um valor do tipo T.

Value
Um valor do tipo T.

Valor de retorno

O valor contido pelo objeto atomic imediatamente antes de a operação ter sido executada.

Comentários

A função atomic_fetch_xor executa uma operação de leitura, alteração e gravação para substituir o valor armazenado de Atom por um exclusive or bit a bit de Value e o valor atual armazenado em Atom usando memory_order.memory_order_seq_cst.

atomic_fetch_xor_explicit

Executa um exclusive or bit a bit em um valor e um valor existente que é armazenado em um objeto atomic.

template <class T>
inline T atomic_fetch_xor_explicit(
    volatile atomic<T>* Atom,
    T Value,
    memory_order Order) noexcept;

template <class T>
inline T atomic_fetch_xor_explicit(
    volatile atomic<T>* Atom,
    T Value,
    memory_order Order) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que armazena um valor do tipo T.

Value
Um valor do tipo T.

Order
Um memory_order.

Valor de retorno

O valor contido pelo objeto atomic imediatamente antes de a operação ter sido executada.

Comentários

A função atomic_fetch_xor_explicit executa uma operação de leitura, alteração e gravação para substituir o valor armazenado de Atom por um exclusive or bit a bit de Value e o valor atual armazenado em Atom, dentro das restrições de memory_order especificadas por Order.

atomic_flag_clear

Define o sinalizador bool em um objeto atomic_flag como false, dentro de memory_order.memory_order_seq_cst.

inline void atomic_flag_clear(volatile atomic_flag* Flag) noexcept;
inline void atomic_flag_clear(atomic_flag* Flag) noexcept;

Parâmetros

Flag
Um ponteiro para um objeto atomic_flag.

atomic_flag_clear_explicit

Define o sinalizador bool em um objeto atomic_flag como false, dentro das restrições de memory_order especificadas.

inline void atomic_flag_clear_explicit(volatile atomic_flag* Flag, memory_order Order) noexcept;
inline void atomic_flag_clear_explicit(atomic_flag* Flag, memory_order Order) noexcept;

Parâmetros

Flag
Um ponteiro para um objeto atomic_flag.

Order
Um memory_order.

atomic_flag_test_and_set

Define o sinalizador bool em um objeto atomic_flag como true, dentro das restrições de memory_order.memory_order_seq_cst.

inline bool atomic_flag_test_and_set(volatile atomic_flag* Flag,) noexcept;
inline bool atomic_flag_test_and_set(atomic_flag* Flag,) noexcept;

Parâmetros

Flag
Um ponteiro para um objeto atomic_flag.

Valor de retorno

O valor inicial de Flag.

atomic_flag_test_and_set_explicit

Define o sinalizador bool em um objeto atomic_flag como true, dentro das restrições de memory_order especificadas.

inline bool atomic_flag_test_and_set_explicit(volatile atomic_flag* Flag, memory_order Order) noexcept;
inline bool atomic_flag_test_and_set_explicit(atomic_flag* Flag, memory_order Order) noexcept;

Parâmetros

Flag
Um ponteiro para um objeto atomic_flag.

Order
Um memory_order.

Valor de retorno

O valor inicial de Flag.

atomic_init

Define o valor armazenado em um objeto atomic.

template <class Ty>
inline void atomic_init(volatile atomic<Ty>* Atom, Ty Value) noexcept;
template <class Ty>
inline void atomic_init(atomic<Ty>* Atom, Ty Value) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que armazena um valor do tipo Ty.

Value
Um valor do tipo Ty.

Comentários

atomic_init não é uma operação atômica. Não é thread-safe.

atomic_is_lock_free

Especifica se operações atômicas em um objeto atomic são livres de bloqueio.

template <class T>
inline bool atomic_is_lock_free(const volatile atomic<T>* Atom) noexcept;
template <class T>
inline bool atomic_is_lock_free(const atomic<T>* Atom) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que armazena um valor do tipo T.

Valor de retorno

true se operações atômicas em Atom estiverem livres de bloqueio; caso contrário, false.

Comentários

Um tipo atômico será livre de bloqueio se nenhuma operação atômica no tipo usar bloqueios. Se essa função retornar true, o tipo será seguro para usar em manipuladores de sinal.

atomic_load

Recupera o valor armazenado em um objeto atomic.

template <class Ty>
inline Ty atomic_load(const volatile atomic<Ty>* Atom) noexcept;
template <class Ty>
inline Ty atomic_load(const atomic<Ty>* Atom) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que contém um valor do tipo Ty.

Valor de retorno

O valor recuperado armazenado em Atom.

Comentários

atomic_load usa implicitamente memory_order.memory_order_seq_cst.

atomic_load_explicit

Recupera o valor armazenado em um objeto atomic dentro de um memory_order especificado.

template <class Ty>
inline Ty atomic_load_explicit(const volatile atomic<Ty>* Atom, memory_order Order) noexcept;
template <class Ty>
inline Ty atomic_load_explicit(const atomic<Ty>* Atom, memory_order Order) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que contém um valor do tipo Ty.

Order
Um memory_order. Não use memory_order_release nem memory_order_acq_rel.

Valor de retorno

O valor recuperado armazenado em Atom.

atomic_signal_fence

Atua como um limite (uma primitiva de sincronização de memória que impõe ordenação entre operações de carregar/armazenar) entre outros limites em um thread de chamada que tem manipuladores de sinal executados no mesmo thread.

inline void atomic_signal_fence(memory_order Order) noexcept;

Parâmetros

Order
Uma restrição de ordenação de memória que determina o tipo de limite.

Comentários

O argumento Order determina o tipo de limite.

Valor Descrição
memory_order_relaxed O limite não tem efeito.
memory_order_consume O limite é um limite de aquisição.
memory_order_acquire O limite é um limite de aquisição.
memory_order_release O limite é um limite de versão.
memory_order_acq_rel O limite é tanto um limite de aquisição quanto um limite de versão.
memory_order_seq_cst O limite é tanto um limite de aquisição quanto um limite de versão e é sequencialmente consistente.

atomic_store

Armazena atomicamente um valor em um objeto atomic.

template <class Ty>
inline Ty atomic_store_explicit(const volatile atomic<Ty>* Atom, Ty Value) noexcept;
template <class Ty>
inline Ty atomic_store_explicit(const atomic<Ty>* Atom, T Value) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que contém um valor do tipo Ty.

Value
Um valor do tipo Ty.

Comentários

atomic_store armazena Value no objeto que é apontado por Atom, dentro da restrição memory_order.memory_order_seq_cst.

atomic_store_explicit

Armazena atomicamente um valor em um objeto atomic.

template <class Ty>
inline Ty atomic_store_explicit(
    const volatile atomic<Ty>* Atom,
    Ty Value,
    memory_order Order) noexcept;

template <class Ty>
inline Ty atomic_store_explicit(
    const atomic<Ty>* Atom,
    T Value,
    memory_order Order) noexcept;

Parâmetros

Atom
Um ponteiro para um objeto atomic que contém um valor do tipo Ty.

Value
Um valor do tipo Ty.

Order
Um memory_order. Não use memory_order_consume, memory_order_acquire nem memory_order_acq_rel.

Comentários

atomic_store armazena Value no objeto apontado por Atom, dentro do memory_order especificado por Order.

atomic_thread_fence

Atua como um limite (uma primitiva de sincronização de memória que impõe a ordenação entre operações de carregar/armazenar) sem uma operação atômica associada.

inline void atomic_thread_fence(memory_order Order) noexcept;

Parâmetros

Order
Uma restrição de ordenação de memória que determina o tipo de limite.

Comentários

O argumento Order determina o tipo de limite.

Valor Descrição
memory_order_relaxed O limite não tem efeito.
memory_order_consume O limite é um limite de aquisição.
memory_order_acquire O limite é um limite de aquisição.
memory_order_release O limite é um limite de versão.
memory_order_acq_rel O limite é tanto um limite de aquisição quanto um limite de versão.
memory_order_seq_cst O limite é tanto um limite de aquisição quanto um limite de versão e é sequencialmente consistente.

kill_dependency

Remove uma dependência.

template <class Ty>
Ty kill_dependency(Ty Arg) noexcept;

Parâmetros

Arg
Um valor do tipo Ty.

Valor de retorno

O valor de retorno é Arg. A avaliação de Arg não carregam uma dependência para a chamada de função. Dividindo uma cadeia de dependências possível, a função pode permitir que o compilador gere código mais eficiente.

Confira também

<atomic>