Почему C++ atomics именно такие

В C++11 появились новые типы данных atomic <T>, позволяющие выполнять гарантированно атомарные операции с памятью. Для операций с данными новых типов можно указать порядок, в котором они, а также операции до и после них, достигнут глобальной памяти, то есть станут видны другим тредам.

По умолчанию используется порядок sequential consistency: все атомарные операции становятся видны всем тредам в одной и той же последовательности. Они не меняются местами с предшествующими или последующими операциями с памятью в треде, который их выполняет. C++ предоставляет возможность запросить и более слабые гарантии: release, acquire, consume, relaxed memory order.

Я попытаюсь объяснить, почему в C++ действительно нужны пять (а на самом деле шесть) видов гарантий. Я расскажу, откуда они появились, что означают и как код, использующий эти гарантии, компилируется на x86 и Power.