Да, возможно, что z.load() == 0
в вашем коде, если вы используете порядок acquire
/ release
, как вы сделали.Между независимыми записями в x
и y
не существует отношений «до и после».Это не случайное совпадение, которое использовалось в этом примере специально для иллюстрации случая, когда приобретение / освобождение недостаточно.
Это иногда называют IRIW (независимое чтение независимых записей), и в некоторых случаях оно скрыто.модели аппаратного заказа.В частности, модель памяти, определяемая только с точки зрения возможной загрузки-загрузки, загрузки-хранения, хранения-хранения и т. Д., Переупорядочений, ничего не говорит о IRIW.В модели памяти x86 переупорядочение IRIW запрещено из-за предложения, объясняющего, что хранилища имеют общий порядок, и все процессоры просматривают хранилища в этом же порядке.
Я не знаю, допускают ли какие-либо общие процессоры общего пользованияIRIW меняет порядок, когда используются барьеры и / или инструкции, необходимые для приобретения и выпуска, но я не удивлюсь, если некоторые из них сделают.