Несинхронизированные обращения к разделяемым переменным опасны, и одной из причин этого является нарушение порядка.
X86 сохраняет записи в порядке (в потоке), но не читает.
Это может привести к неприятностям, если вы предполагаете, что заказ остается. Например:
Поток A записывает в x, а затем в y. Предполагая, что компилятор не переупорядочивает его, процессор не будет переупорядочивать его (x86 не будет, другие могут).
поток B читает у, а затем х. Вы можете подумать, что если оно получило новое значение y, то наверняка вы получите и новое значение x.
Не так. Процессор может изменить порядок чтения потока B, так что y будет фактически прочитано раньше.
РЕДАКТИРОВАТЬ : как указал «Человек с односторонним движением», в этом случае x86 (но не все процессоры!) Гарантирует порядок.
Я цитирую руководство разработчика программного обеспечения Intel:
Записи одного процессора наблюдаются всеми в одном и том же порядке
процессоры.
Это не относится к операциям записи несколькими процессорами - они могут выглядеть по-разному для разных процессоров.
Однако я настоятельно рекомендую не полагаться на него, а использовать вместо него правильную синхронизацию.
Примитивы синхронизации реализованы с атомарными операциями и / или барьерами, которые обеспечивают вам безопасность.