Для последовательной согласованности для выровненных нагрузок и хранилищ достаточно на x86, чтобы следовать каждому хранилищу с инструкцией mfence
.Однако в этом нет необходимости: более агрессивный подход требует лишь обеспечения появления инструкции mfence
между каждой возможной парой хранилищ и последующими инструкциями загрузки.Например, для последовательности инструкций хранилища, не прерываемых загрузкой, не потребуется никаких mfence
, кроме как после окончательного сохранения.
Если вы хотите выполнить сложную операцию (например, увеличить значение) атомарно, вынужно больше mfence
- вам нужна заблокированная инструкция, такая как lock inc
.Это также подразумевает тот же барьер, что и mfence
, поэтому в этом случае дополнительный барьер не требуется.
На практике mfence
не может быть идеальным выбором для обеспечения последовательной согласованности даже для простых целей хранения, поскольку егопроизводительность кажется хуже, чем заблокированная операция, поэтому вместо нее можно использовать, например, lock xchg
.