C++ · Avançado · Inglês · Técnico
memory order
Parâmetro das operações atômicas, como memory_order_acquire, que define quais garantias de ordenação e visibilidade a operação dá em relação às demais threads.
Onde usar
Usado em estruturas sem lock para pagar só o custo necessário: release na escrita e acquire na leitura bastam para publicar dados entre threads. O padrão seq_cst é o mais forte e o mais seguro.
Em código
std::atomic<bool> ok{false};
int dado = 0;
auto rel = std::memory_order_release;
auto acq = std::memory_order_acquire;
// thread A
dado = 42; ok.store(true, rel);
// thread B
while (!ok.load(acq)); // dado == 42Exemplos
Store with release and load with acquire to publish the data.
Grave com release e leia com acquire para publicar os dados.
Don't use relaxed unless you can prove it's enough.
Não use relaxed a menos que consiga provar que basta.
Cuidado
Ordens relaxadas só garantem atomicidade, sem ordenar outros acessos; usar relaxed onde se precisa de sincronização causa bugs raros e difíceis de reproduzir.
Sinônimos
ordem de memória