Функция MemoryBarrier (winnt.h)
Создает аппаратный барьер памяти (ограждение), который не позволяет ЦП переупорядочения операций чтения и записи. Это также может помешать компилятору переупорядочения операций чтения и записи.
Синтаксис
void MemoryBarrier();
Возвращаемое значение
None
Remarks
Используйте этот макрос или заблокированные функции, если порядок операций чтения и записи в памяти имеет решающее значение для операций программы.
Встроенные функции компилятора _ReadBarrier, _WriteBarrier и _ReadWriteBarrier препятствуют только переупорядочению компилятора. В Visual Studio 2003 упорядочены ссылки из переменных в переменные ; компилятор не будет переупорядочения доступа к переменным переменным . В Visual Studio 2005 компилятор также использует семантику получения для операций чтения с переменными и семантику выпуска для операций записи в переменных (при поддержке ЦП). Дополнительные сведения см. в статье Синхронизация и многопроцессорные проблемы.
Этот макрос можно вызывать на всех платформах процессоров, где поддерживается Windows, но он не влияет на некоторые платформы. Определение зависит от платформы. Ниже приведены некоторые определения этого макроса в Winnt.h.
#ifdef _AMD64_
#define MemoryBarrier __faststorefence
#endif
#ifdef _IA64_
#define MemoryBarrier __mf
#endif
// x86
FORCEINLINE
VOID
MemoryBarrier (
VOID
)
{
LONG Barrier;
__asm {
xchg Barrier, eax
}
}
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows Vista [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2003 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | winnt.h (включая Windows.h) |