Поделиться через


Функция 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)

См. также раздел

Доступ к заблокированным переменным