У документації std::memory_order
на сайті cppreference.com є приклад розслабленого замовлення:
Розслаблене замовлення
Атомні операції з тегом
memory_order_relaxed
не є операціями синхронізації; вони не нав'язують порядок серед паралельних доступу до пам'яті. Вони гарантують лише атомність та послідовність порядку модифікації.Наприклад, спочатку x і y дорівнює нулю,
// 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, отже, умовна частина останнього речення знімка ніколи не буде виконана.