Bariera pamięci (memory fence)
Instrukcja ograniczająca, jak operacje na pamięci mogą być przesuwane wokół niej. Jest potrzebna, bo zarówno kompilator, jak i procesor zmieniają kolejność za twoimi plecami.
W kodzie jednowątkowym zmiana kolejności jest niewidoczna — wynik jest ten sam — a w wielowątkowym bywa druzgocąca. Klasyczny błąd to opublikowanie wskaźnika do obiektu, zanim jego pola staną się widoczne dla innego rdzenia, który odczytuje wtedy śmieci z obiektu niezainicjowanego z jego punktu widzenia. Bariery występują w wariantach odpowiadających modelom uporządkowania: bariera acquire zatrzymuje późniejsze odczyty przed przesunięciem w przód, bariera release wcześniejsze zapisy przed przesunięciem w tył, a pełna bariera zatrzymuje wszystko. Zaskakują dwie rzeczy. Zmiana kolejności przez kompilator i przez sprzęt to osobne problemy i oba trzeba rozwiązać, dlatego volatile nie jest narzędziem do wątków. Poza tym silne uporządkowanie x86 sprawia, że błędny kod często tam działa, a na ARM przestaje.