W dokumentacji std::memory_order
na cppreference.com jest przykład swobodnego zamawiania:
Zrelaksowane zamawianie
Oznaczone operacje atomowe
memory_order_relaxed
nie są operacjami synchronizacji; nie narzucają kolejności między dostępami do pamięci jednocześnie. Gwarantują one tylko atomowość i spójność kolejności modyfikacji.Na przykład, gdy xiy początkowo wynoszą 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
wolno wytwarzać r1 == r2 == 42, ponieważ chociaż A jest sekwencjonowane przed B w wątku 1, a C jest sekwencjonowane przed D w wątku 2, nic nie stoi na przeszkodzie, aby D pojawił się przed A w kolejności modyfikacji y, a B z występujące przed C w kolejności modyfikacji x. Efekt uboczny D na y może być widoczny dla obciążenia A w gwincie 1, podczas gdy efekt uboczny B na x może być widoczny dla obciążenia C w gwincie 2. W szczególności może to wystąpić, jeśli D zostanie zakończone przed C w wątek 2, z powodu zmiany kolejności kompilatora lub w czasie wykonywania.
mówi „C jest sekwencjonowane przed D w wątku 2”.
Zgodnie z definicją sekwencjonowania przed, którą można znaleźć w kolejności oceny , jeśli A jest sekwencjonowane przed B, wówczas ocena A zostanie zakończona przed rozpoczęciem oceny B. Ponieważ C jest sekwencjonowane przed D w wątku 2, C musi zostać zakończone przed rozpoczęciem D, dlatego część warunku ostatniego zdania migawki nigdy nie będzie spełniona.