Meu compilador é clang 18.1.0-rc1; e o código a seguir aciona dois avisos:
#include <atomic>
std::atomic<int> n;
int main() {
// Warning: Memory order argument to atomic operation is invalid
n.load(std::memory_order_acq_rel);
// Warning: Memory order argument to atomic operation is invalid
n.store(1, std::memory_order_acq_rel);
}
Qual é o uso legal de std::memory_order_acq_rel
?
Atualizar
n.fetch_add(1, std::memory_order_acq_rel); // now is ok
É válido com RMWs como
fetch_add
aquele que carrega e armazena em uma operação.A parte de aquisição
acq_rel
é válida para o lado da carga, a parte de liberação é válida para o lado da loja.Ele avisa sobre comportamentos indefinidos em seu código.
std::atomic<T>::load
: seorder
for um entrestd::memory_order_release
estd::memory_order_acq_rel
, o comportamento será indefinido.std::atomic<T>::store
: seorder
for um de estd::memory_order_consume
, o comportamento será indefinido.std::memory_order_acquire
std::memory_order_acq_rel
As operações válidas para
std::memory_order_acq_rel
arestd::atomic<T>::fetch_add
estd::atomic<T>::exchange()
as outras operações de leitura-modificação-gravação.