Na documentação de std::memory_order
em cppreference.com, há um exemplo de pedido relaxado:
Ordenação descontraída
As operações atômicas marcadas
memory_order_relaxed
não são operações de sincronização; eles não impõem uma ordem entre acessos simultâneos à memória. Eles garantem apenas consistência de ordem de atomicidade e modificação.Por exemplo, com xey inicialmente zero,
// Thread 1: r1 = y.load(std::memory_order_relaxed); // A x.store(r1, std::memory_order_relaxed); // B // Thread 2: r2 = x.load(std::memory_order_relaxed); // C y.store(42, std::memory_order_relaxed); // D
é permitido produzir r1 == r2 == 42 porque, embora A seja sequenciado antes de B no segmento 1 e C seja sequenciado antes de D no segmento 2, nada impede que D apareça antes de A na ordem de modificação de y e B de aparecendo antes de C na ordem de modificação de x. O efeito colateral de D em y pode ser visível para a carga A no encadeamento 1, enquanto o efeito colateral de B em x pode ser visível na carga C no encadeamento 2. Em particular, isso pode ocorrer se D for concluído antes de C em segmento 2, devido a reordenação do compilador ou em tempo de execução.
diz "C é sequenciado antes de D no segmento 2".
De acordo com a definição de sequenciado antes, que pode ser encontrado em Ordem de avaliação , se A for sequenciado antes de B, a avaliação de A será concluída antes do início da avaliação de B. Como C é sequenciado antes de D no encadeamento 2, C deve ser concluído antes do início de D, portanto, a parte da condição da última frase do instantâneo nunca será satisfeita.