У меня есть код, который использует __sync_val_compare_and_swap с моей кросс-платформенной реализацией shared_mutex.Windows-версия (# ifdef'd) использует _InterlockedCompareExchange-intrinsic, которая имеет полное физическое (для упорядочения загрузок и хранения процессором) и логическое (для компилятора) поведение получения и выпуска.Я не нашел никакой документации, что __sync_val_compare_and_swap-intrinsic также имеет некоторые логические эффекты на порядок загрузки и сохранения в компиляторе.Так есть ли какая-либо «внутренняя» сила, заставляющая компилятор иметь логический барьер для получения или освобождения?Я знаю, что есть asm volatile("" ::: "memory");
с gcc, но это также имеет поведение при получении и выпуске.