Если мы потратим время (или, если хотите, последовательности команд), чтобы течь вниз, точно так же, как читаем код, то я понимаю, что
- Ограждение получения позволяет другим доступам к памяти перемещаться вниз за пределы ограждения, но не вверх за пределы ограждения.
- Съемное ограждение позволяет другим доступам к памяти перемещаться вверх за ограждение, но не вниз за ограждение
Другими словами, если у вас есть код типа
acquire
// other stuff
release
тогда обращения к памяти могут перемещаться из-за пределов пары получения / выпуска внутрь, но не наоборот (и они могут также не пропускать пару получения / выпуска полностью).
С семантикой ослабленной согласованности в вашем первом примере, о котором идет речь, аппаратное обеспечение может переупорядочивать обращения к памяти таким образом, чтобы хранилища входили в систему памяти перед загрузкой, что позволяет r1 = r2 = 1. С семантикой получения / выпуска во втором примере это переупорядочение предотвращается, и, таким образом, r1 = r2 = 1. невозможно.