Обычная загрузка имеет семантику приобретения на x86, обычное хранилище имеет семантику выпуска, однако компилятор все еще может переупорядочивать инструкции. В то время как ограждения и заблокированные инструкции (заблокированный xchg, заблокированный cmpxchg) предотвращают переупорядочение как оборудования, так и компилятора, простые загрузки и сохранения по-прежнему необходимы для защиты с помощью барьеров компилятора. Visual C ++ предоставляет функцию _ReadWriterBarrier (), которая предотвращает переупорядочение компилятора, также C ++ предоставляет ключевое слово volatile по той же причине. Я пишу всю эту информацию, чтобы убедиться, что я все правильно понял. Итак, все написанное выше верно, есть ли причина отмечать переменные как изменчивые, которые будут использоваться в функциях, защищенных с помощью _ReadWriteBarrier ()?
Например:
int load(int& var)
{
_ReadWriteBarrier();
T value = var;
_ReadWriteBarrier();
return value;
}
Безопасно ли сделать эту переменную энергонезависимой? Насколько я понимаю, это так, потому что функция защищена, и компилятор внутри не может переупорядочить. С другой стороны, Visual C ++ обеспечивает специальное поведение для изменчивых переменных (отличное от стандартного), он делает изменчивые чтения и записывает атомарные загрузки и хранилища, но моя цель - x86, а простые загрузки и хранилища должны быть атомарными на x86. в любом случае, верно?
Заранее спасибо.