Мне нужно понять, как работает память на многоядерных машинах. Скажи, у меня есть этот код
Core 1
mov [_x], 1; mov r1, [_y]
Core 2
mov [_y], 1; mov r2, [_x]
Теперь неожиданные результаты без ограждений памяти могут заключаться в том, что и r1, и r2 могут быть 0 после выполнения. По моему мнению, чтобы противостоять этой проблеме, мы должны поставить забор памяти в обоих кодах, так как использование только одного из них все равно не решит проблему. Что-то вроде следующего ...
Core 1
mov [_x], 1; memory_fence; mov r1, [_y]
Core 2
mov [_y], 1; memory_fence; mov r2, [_x]
Мое понимание верно, или я все еще что-то упускаю? Предположим, архитектура x86. Кроме того, кто-то может сказать мне, как поместить заборы памяти в коде C ++?