Partilhar via


<atomic> funções

O <atomic> cabeçalho fornece as seguintes funções:

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 atomic objeto 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.

Observações

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

atomic_compare_exchange_strong_explicit

Executa uma atomic compare and exchange operação.

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 atomic objeto que armazena um valor do tipo Ty.

Exp
Um ponteiro para um valor do tipo Ty.

Value
Um valor do tipo Ty.

Order1
Primeiro memory_order argumento.

Order2
Segundo memory_order argumento. O valor de Order2 não pode ser memory_order_release ou memory_order_acq_rel, não pode ser mais forte do que o valor de Order1.

Valor de retorno

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

Observações

Um atomic compare and exchange operation compara o valor armazenado no objeto apontado por Atom com o valor apontado por Exp. Se os valores forem iguais, o valor armazenado no objeto apontado por Atom será substituído por Value usando uma operação de leitura-modificação-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 pelo 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 atomic objeto 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.

Observações

Este método executa uma comparação atômica fraca e operação de troca que tem argumentos implícitos memory_order.memory_order_seq_cst . 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 atomic objeto que armazena um valor do tipo Ty.

Exp
Um ponteiro para um valor do tipo Ty.

Value
Um valor do tipo Ty.

Order1
Primeiro memory_order argumento.

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

Valor de retorno

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

Observações

Tanto os sabores fortes quanto fracos de uma atomic compare and exchange operation garantia de que eles não armazenam o novo valor se os valores esperados e atuais não forem iguais. O sabor forte garante que armazenará o novo valor se os valores esperados e atuais forem iguais. O sabor fraco às vezes pode retornar false e não armazenar o novo valor, mesmo que os valores atuais e esperados sejam iguais. Em outras palavras, a função retornará false, mas um exame posterior do valor esperado pode revelar que ele não mudou e, portanto, deveria 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 atomic objeto que armazena um valor do tipo Ty.

Value
Um valor do tipo Ty.

Valor de retorno

O valor armazenado de antes da Atom troca.

Observações

A atomic_exchange função executa uma operação de leitura-modificação-gravação para trocar o valor armazenado com AtomValue, usando o 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 atomic objeto que armazena um valor do tipo Ty.

Value
Um valor do tipo Ty.

Order
Um memory_order.

Valor de retorno

O valor armazenado de antes da Atom troca.

Observações

A atomic_exchange_explicit função executa uma operação de leitura-modificação-gravação para trocar o valor armazenado com AtomValue, dentro das restrições de memória especificadas pelo Order.

atomic_fetch_add

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

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 atomic objeto que armazena um ponteiro para digitar T.

Value
Um valor do tipo ptrdiff_t.

Valor de retorno

O valor do ponteiro contido pelo objeto imediatamente antes da atomic operação ser executada.

Observações

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

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

Esta operação também é 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 atomic objeto.

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 atomic objeto que armazena um ponteiro para digitar T.

Value
Um valor do tipo ptrdiff_t.

Valor de retorno

O valor do ponteiro contido pelo objeto imediatamente antes da atomic operação ser executada.

Observações

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

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

Esta operação também é 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 atomic objeto.

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 atomic objeto que armazena um valor do tipo T.

Value
Um valor do tipo T.

Valor de retorno

O valor contido pelo objeto imediatamente antes da atomic operação ser executada.

Observações

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

atomic_fetch_and_explicit

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

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 atomic objeto 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 imediatamente antes da atomic operação ser executada.

Observações

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

atomic_fetch_or

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

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 atomic objeto que armazena um valor do tipo T.

Value
Um valor do tipo T.

Valor de retorno

O valor contido pelo objeto imediatamente antes da atomic operação ser executada.

Observações

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

atomic_fetch_or_explicit

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

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 atomic objeto 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 imediatamente antes da atomic operação ser executada.

Observações

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

atomic_fetch_sub

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

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 atomic objeto que armazena um ponteiro para digitar T.

Value
Um valor do tipo ptrdiff_t.

Valor de retorno

O valor do ponteiro contido pelo objeto imediatamente antes da atomic operação ser executada.

Observações

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

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

Esta operação também é 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 armazenado em um atomic objeto.

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 atomic objeto que armazena um ponteiro para digitar T.

Value
Um valor do tipo ptrdiff_t.

Valor de retorno

O valor do ponteiro contido pelo objeto imediatamente antes da atomic operação ser executada.

Observações

A atomic_fetch_sub_explicit função executa uma operação de leitura-modificação-gravação para subtrair Value atomicamente do valor armazenado em Atom, dentro das memory_order restrições especificadas pelo Order.

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

Esta operação também é 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 bit a bit exclusive or em um valor e um valor existente que é armazenado em um atomic objeto.

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 atomic objeto que armazena um valor do tipo T.

Value
Um valor do tipo T.

Valor de retorno

O valor contido pelo objeto imediatamente antes da atomic operação ser executada.

Observações

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

atomic_fetch_xor_explicit

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

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 atomic objeto 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 imediatamente antes da atomic operação ser executada.

Observações

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

atomic_flag_clear

Define o bool sinalizador em um atomic_flag objeto como false, dentro do 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 atomic_flag objeto.

atomic_flag_clear_explicit

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

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 atomic_flag objeto.

Order
Um memory_order.

atomic_flag_test_and_set

Define o bool sinalizador em um atomic_flag objeto como true, dentro das restrições do 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 atomic_flag objeto.

Valor de retorno

O valor inicial de Flag.

atomic_flag_test_and_set_explicit

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

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 atomic_flag objeto.

Order
Um memory_order.

Valor de retorno

O valor inicial de Flag.

atomic_init

Define o valor armazenado em um atomic objeto.

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 atomic objeto que armazena um valor do tipo Ty.

Value
Um valor do tipo Ty.

Observações

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

atomic_is_lock_free

Especifica se as operações atômicas em um atomic objeto 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 atomic objeto que armazena um valor do tipo T.

Valor de retorno

true se as operações atómicas estiverem isentas Atom de bloqueio, caso contrário, false.

Observações

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

atomic_load

Recupera o valor armazenado em um atomic objeto.

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 atomic objeto que contém um valor do tipo Ty.

Valor de retorno

O valor recuperado armazenado em Atom.

Observações

atomic_load usa implicitamente o memory_order.memory_order_seq_cst.

atomic_load_explicit

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

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 atomic objeto que contém um valor do tipo Ty.

Order
Um memory_order. Não utilize memory_order_release ou memory_order_acq_rel.

Valor de retorno

O valor recuperado armazenado em Atom.

atomic_signal_fence

Atua como uma cerca — uma primitiva de sincronização de memória que impõe a ordenação entre operações de carga/armazenamento — entre outras cercas em um thread de chamada que têm 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 cerca.

Observações

O Order argumento determina o tipo de cerca.

Valor Descrição
memory_order_relaxed A cerca não tem efeito.
memory_order_consume A cerca é uma cerca de aquisição.
memory_order_acquire A cerca é uma cerca de aquisição.
memory_order_release A cerca é uma cerca de libertação.
memory_order_acq_rel A cerca é tanto uma cerca de aquisição quanto uma cerca de liberação.
memory_order_seq_cst A cerca é tanto uma cerca de aquisição quanto uma cerca de liberação, e é sequencialmente consistente.

atomic_store

Atomicamente armazena um valor em um atomic objeto.

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 atomic objeto que contém um valor do tipo Ty.

Value
Um valor do tipo Ty.

Observações

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

atomic_store_explicit

Atomicamente armazena um valor em um atomic objeto.

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 atomic objeto que contém um valor do tipo Ty.

Value
Um valor do tipo Ty.

Order
Um memory_order. Não utilize memory_order_consume, memory_order_acquireou memory_order_acq_rel.

Observações

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

atomic_thread_fence

Atua como uma cerca — uma primitiva de sincronização de memória que impõe a ordenação entre operações de carga/armazenamento — 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 cerca.

Observações

O Order argumento determina o tipo de cerca.

Valor Descrição
memory_order_relaxed A cerca não tem efeito.
memory_order_consume A cerca é uma cerca de aquisição.
memory_order_acquire A cerca é uma cerca de aquisição.
memory_order_release A cerca é uma cerca de libertação.
memory_order_acq_rel A cerca é tanto uma cerca de aquisição quanto uma cerca de liberação.
memory_order_seq_cst A cerca é tanto uma cerca de aquisição quanto uma cerca de liberaçã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 não carrega uma dependência para a chamada de Arg função. Ao quebrar uma possível cadeia de dependência, a função pode permitir que o compilador gere código mais eficiente.

Ver também

<atomic>