У вас есть два block B
в вашем примере.Я говорю о функции загрузки void f()
.
Возможно ли, что часть блока B может быть переупорядочена перед загрузкой?
Да.Компилятор может поднимать нагрузки из тела if()
и выполнять их до b.load
.Это может произойти, если оба блока B и C читают одну и ту же неатомарную переменную.
И существуют реальные механизмы, которые будут создавать это переупорядочение даже без переупорядочения во время компиляции:
В частности, спекуляция ветвления (то есть прогноз ветвления + спекулятивное выполнение не по порядку) позволит ЦПУ начать выполнение блока B до того, как b.load()
даже запустится.
Вы не можете зависетьв отношении "причинности" или любых других рассуждений, таких как "ему нужно знать результат b.load()
, прежде чем он сможет знать, что выполнять дальше".
Или компилятор может потенциально выполнить if-преобразование if()
в код без ответвлений, если в блоке В нет хранилищ. Тогда вполне очевидно, что он может переупорядочить с неатомарными нагрузками или другими ослабленными или получающими нагрузками, которые были в блоке В и С.
(Помните, что acq / rel являются односторонними барьерами.)
Подобные рассуждения (основанные на том, что могут делать настоящие компиляторы и процессоры) могут быть полезны, чтобы доказать, что что-то не безопасный. Но будьте осторожны, если вы пойдете другим путем: рассуждение, основанное на «безопасном для компилятора, о котором я знаю», не всегда означает «безопасное в переносимом ISO C ++» .
Иногда «безопасное включениекомпилятор, о котором я знаю, «более или менее достаточен, но его трудно отделить от того, что« работает над компиляцией, о которой я знаю », где будущая версия компилятора или, казалось бы, несвязанное изменение исходного кода может что-то сломать.
Поэтому всегда старайтесь рассуждать о порядке памяти с точки зрения модели памяти C ++, а также с точки зрения того, как она может эффективно компилироваться для интересующего вас ISA (например, строго упорядоченного x86).Как вы могли заметить, что relaxed позволит переупорядочить во время компиляции, что на самом деле полезно в вашем случае.