Biblioteca Atômica C ++ - Compare o Exchange
Descrição
Ele compara atomicamente o valor do objeto atômico com o argumento não atômico e executa a troca atômica se for igual ou a carga atômica se não for.
Declaração
A seguir está a declaração para std :: atomic_compare_exchange_weak.
template< class T >
bool atomic_compare_exchange_weak( volatile std::atomic<T>* obj,
T* expected, T desired );
C ++ 11
template< class T <
bool atomic_compare_exchange_weak( std::atomic<T>* obj,
T* expected, T desired );
A seguir está a declaração para std :: atomic_compare_exchange_strong.
template< class T >
bool atomic_compare_exchange_strong( volatile std::atomic<T>* obj,
T* expected, T desired );
C ++ 11
template< class T >
bool atomic_compare_exchange_strong( std::atomic<T>* obj,
T* expected, T desired );
A seguir está a declaração para std :: atomic_compare_exchange_weak_explicit.
template< class T >
bool atomic_compare_exchange_weak_explicit( volatile std::atomic<T>* obj,
T* expected, T desired,
std::memory_order succ,
std::memory_order fail );
C ++ 11
template< class T >
bool atomic_compare_exchange_weak_explicit( std::atomic<T>* obj,
T* expected, T desired,
std::memory_order succ,
std::memory_order fail );
A seguir está a declaração para std :: atomic_compare_exchange_strong_explicit.
template< class T >
bool atomic_compare_exchange_strong_explicit( std::atomic<T>* obj,
T* expected, T desired,
std::memory_order succ,
std::memory_order fail );
C ++ 11
template< class T >
bool atomic_compare_exchange_strong_explicit( volatile std::atomic<T>* obj,
T* expected, T desired,
std::memory_order succ,
std::memory_order fail );
Parâmetros
obj - É usado como ponteiro para o objeto atômico a ser modificado.
desr - É usado para armazenar o valor no objeto atômico.
order - É usado para sincronizar a ordem da memória para esta operação.
succ- É usado na ordem de sincronização de memória para a operação de leitura-modificação-gravação se a comparação for bem-sucedida. Todos os valores são permitidos.
fail- É usado na ordem de sincronização de memória para a operação de carregamento se a comparação falhar. Não pode ser std :: memory_order_release ou std :: memory_order_acq_rel e não pode especificar uma ordem mais forte do que succ.
Valor de retorno
Ele retorna o resultado da comparação: verdadeiro se * obj for igual a * esperado, falso caso contrário.
Exceções
No-noexcept - esta função de membro nunca lança exceções.
Exemplo
No exemplo abaixo para std :: atomic_compare_exchange.
#include <atomic>
template<class T>
struct node {
T data;
node* next;
node(const T& data) : data(data), next(nullptr) {}
};
template<class T>
class stack {
std::atomic<node<T>*> head;
public:
void push(const T& data) {
node<T>* new_node = new node<T>(data);
new_node->next = head.load(std::memory_order_relaxed);
while(!std::atomic_compare_exchange_weak_explicit(&head, &new_node->next,
new_node, std::memory_order_release, std::memory_order_relaxed))
;
}
};
int main() {
stack<int> s;
s.push(1);
s.push(2);
s.push(3);
}