В документации std::memory_order
на cppreference.com есть пример непринужденного заказа:
Расслабленный заказ
Маркированные атомарные операции
memory_order_relaxed
не являются операциями синхронизации; они не навязывают порядок между одновременными обращениями к памяти. Они гарантируют только атомарность и согласованность порядка модификации.Например, с х и у изначально ноль,
// 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
разрешено производить r1 == r2 == 42, потому что, хотя A секвенируется перед B в потоке 1, а C секвенируется перед D в потоке 2, ничто не мешает D появляться перед A в порядке изменения y, а B - появляются перед C в порядке модификации x. Побочный эффект D на y может быть виден нагрузке A в потоке 1, в то время как побочный эффект B на x может быть виден нагрузке C в потоке 2. В частности, это может произойти, если D завершен до C в поток 2, либо из-за переупорядочения компилятора, либо во время выполнения.
он говорит: «C секвенируется перед D в потоке 2».
Согласно определению секвенированного до, которое можно найти в Порядке оценки , если A секвенируется до B, тогда оценка A будет завершена до того, как начнется оценка B. Поскольку C секвенируется перед D в потоке 2, C должен быть завершен до начала D, следовательно, условие условия последнего предложения снимка никогда не будет выполнено.