изменчивая переменная и атомарные операции в Visual C ++ x86

Обычная загрузка имеет семантику приобретения на x86, обычное хранилище имеет семантику выпуска, однако компилятор все еще может переупорядочивать инструкции. В то время как ограждения и заблокированные инструкции (заблокированный xchg, заблокированный cmpxchg) предотвращают переупорядочение как оборудования, так и компилятора, простые загрузки и сохранения по-прежнему необходимы для защиты с помощью барьеров компилятора. Visual C ++ предоставляет функцию _ReadWriterBarrier (), которая предотвращает переупорядочение компилятора, также C ++ предоставляет ключевое слово volatile по той же причине. Я пишу всю эту информацию, чтобы убедиться, что я все правильно понял. Итак, все написанное выше верно, есть ли причина отмечать переменные как изменчивые, которые будут использоваться в функциях, защищенных с помощью _ReadWriteBarrier ()?

Например:

int load(int& var)
{
    _ReadWriteBarrier();
    T value = var;
    _ReadWriteBarrier();
    return value;
}

Безопасно ли сделать эту переменную энергонезависимой? Насколько я понимаю, это так, потому что функция защищена, и компилятор внутри не может переупорядочить. С другой стороны, Visual C ++ обеспечивает специальное поведение для изменчивых переменных (отличное от стандартного), он делает изменчивые чтения и записывает атомарные загрузки и хранилища, но моя цель - x86, а простые загрузки и хранилища должны быть атомарными на x86. в любом случае, верно?

Заранее спасибо.

5
задан axe 12 February 2011 в 06:29
поделиться