Проблема может возникнуть из-за оптимизации, включающей переупорядочение инструкций . Другими словами, оба процессора могут назначить r1
и r2
до назначения переменных x
и y
, если они обнаружат, что это приведет к лучшей производительности. Эту проблему можно решить, добавив барьер памяти , который будет обеспечивать ограничение порядка.
Цитировать слайд-шоу , которое вы упомянули в своем сообщении:
Современные многоядерные / языковые разрывы последовательная согласованность .
Что касается архитектуры x86, лучшим ресурсом для чтения является Руководство разработчика программного обеспечения для архитектуры Intel® 64 и IA-32 (Глава 8.2 Порядок памяти ). Разделы 8.2.1 и 8.2.2 описывают упорядочение памяти, осуществляемое
Intel486, Pentium, Intel Core 2 Duo, Intel Atom, Intel Core Duo, Pentium 4, Intel
Процессоры семейства Xeon и P6: модель памяти под названием упорядочение процессоров , в отличие от упорядочение программ ( строгое упорядочение ) более старой архитектуры Intel386 (где чтение и инструкции записи всегда выдавались в порядке их появления в потоке инструкций.
В руководстве описываются многие гарантии заказа модели памяти для процессора (например, Нагрузки не переупорядочиваются при других нагрузках , Хранилища не переупорядочиваются с другими хранилищами , Хранилища не переупорядочиваются со старыми нагрузками и т. д.), но в нем также описывается допустимое правило переупорядочения, которое вызывает состояние гонки в должности ОП:
8.2.3.4 Грузы могут быть переупорядочены с более ранними магазинами в разные
Местоположение
С другой стороны, если первоначальный порядок инструкций был переключен:
shared variables
x = 0, y = 0
Core 1 Core 2
r1 = y; r2 = x;
x = 1; y = 1;
В этом случае процессор гарантирует, что ситуация r1 = 1
и r2 = 1
не разрешена (из-за 8.2.3.3 Хранилища не переупорядочиваются с более ранней гарантией загрузки ), означая, что эти инструкции никогда не будут переупорядочено в отдельных ядрах.
Чтобы сравнить это с различными архитектурами, ознакомьтесь с этой статьей: Упорядочение памяти в современных микропроцессорах ( это изображение специально). Вы можете видеть, что Itanium (IA-64) делает еще больше переупорядочения, чем архитектура IA-32.