встроенные функции _InterlockedExchangeAdd

Блок, относящийся только к системам Майкрософт

Предоставьте встроенную поддержку компилятора _InterlockedExchangeAdd встроенной функции пакета SDK для Windows Win32.

Синтаксис

long _InterlockedExchangeAdd(
   long volatile * Addend,
   long Value
);
long _InterlockedExchangeAdd_acq(
   long volatile * Addend,
   long Value
);
long _InterlockedExchangeAdd_rel(
   long volatile * Addend,
   long Value
);
long _InterlockedExchangeAdd_nf(
   long volatile * Addend,
   long Value
);
long _InterlockedExchangeAdd_HLEAcquire(
   long volatile * Addend,
   long Value
);
long _InterlockedExchangeAdd_HLERelease(
   long volatile * Addend,
   long Value
);
char _InterlockedExchangeAdd8(
   char volatile * Addend,
   char Value
);
char _InterlockedExchangeAdd8_acq(
   char volatile * Addend,
   char Value
);
char _InterlockedExchangeAdd8_rel(
   char volatile * Addend,
   char Value
);
char _InterlockedExchangeAdd8_nf(
   char volatile * Addend,
   char Value
);
short _InterlockedExchangeAdd16(
   short volatile * Addend,
   short Value
);
short _InterlockedExchangeAdd16_acq(
   short volatile * Addend,
   short Value
);
short _InterlockedExchangeAdd16_rel(
   short volatile * Addend,
   short Value
);
short _InterlockedExchangeAdd16_nf(
   short volatile * Addend,
   short Value
);
__int64 _InterlockedExchangeAdd64(
   __int64 volatile * Addend,
   __int64 Value
);
__int64 _InterlockedExchangeAdd64_acq(
   __int64 volatile * Addend,
   __int64 Value
);
__int64 _InterlockedExchangeAdd64_rel(
   __int64 volatile * Addend,
   __int64 Value
);
__int64 _InterlockedExchangeAdd64_nf(
   __int64 volatile * Addend,
   __int64 Value
);
__int64 _InterlockedExchangeAdd64_HLEAcquire(
   __int64 volatile * Addend,
   __int64 Value
);
__int64 _InterlockedExchangeAdd64_HLERelease(
   __int64 volatile * Addend,
   __int64 Value
);

Параметры

Надстройка
[in, out] Добавляемое значение; заменен результатом добавления.

Стоимость
[in] Добавляемое значение.

Возвращаемое значение

Возвращает начальное значение переменной, на которую указывает параметрAddend .

Требования

Intrinsic Архитектура Заголовок
_InterlockedExchangeAdd, _InterlockedExchangeAdd8, _InterlockedExchangeAdd16 x86, ARM, x64, ARM64 <intrin.h>
_InterlockedExchangeAdd64 ARM, x64, ARM64 <intrin.h>
_InterlockedExchangeAdd_acq, _InterlockedExchangeAdd_rel, _InterlockedExchangeAdd_nf, _InterlockedExchangeAdd8_acq, _InterlockedExchangeAdd8_rel, _InterlockedExchangeAdd8_nf,_InterlockedExchangeAdd16_acq, _InterlockedExchangeAdd16_rel, _InterlockedExchangeAdd16_nf, _InterlockedExchangeAdd64_acq, _InterlockedExchangeAdd64_rel, _InterlockedExchangeAdd64_nf ARM, ARM64 <intrin.h>
_InterlockedExchangeAdd_HLEAcquire, _InterlockedExchangeAdd_HLERelease x86, x64 <immintrin.h>
_InterlockedExchangeAdd64_HLEAcquire, _InterlockedExchangeAdd64_HLErelease x64 <immintrin.h>

Замечания

Существуют несколько вариантов _InterlockedExchangeAdd, они различаются в зависимости от типов данных, которые включают, и от того, используется ли семантика получения или освобождения конкретного процессора.

Функция _InterlockedExchangeAdd работает с 32-разрядными целыми значениями, _InterlockedExchangeAdd8работает с 8-разрядными целыми значениями, _InterlockedExchangeAdd16 работает с 16-разрядными целыми значениями и _InterlockedExchangeAdd64 работает с 64-разрядными целыми значениями.

На платформах ARM используйте встроенные функции с суффиксами _acq и _rel, если нужно получить и освободить семантику, например в начале и конце критической секции. Встроенные компоненты с суффиксом _nf ("без забора") не действуют в качестве барьера памяти.

На платформах Intel ®, поддерживающих инструкции Hardware Lock Elision (HLE), встроенные функции с суффиксами _HLEAcquire и _HLERelease включают подсказку процессору, как можно повысить производительность, устраняя шаг записи с блокировкой оборудования. Если эти встроенные компоненты вызываются на платформах, которые не поддерживают HLE, это указание игнорируется.

Эти процедуры доступны только как встроенные объекты. Они являются встроенными, даже если используется встроенный /Oi или #pragma. Невозможно использовать функцию #pragma для этих встроенных функций.

Пример

Пример использования _InterlockedExchangeAddсм. в _InterlockedDecrement.

Завершение блока, относящегося только к системам Майкрософт

См. также

Встроенные компоненты компилятора
Ключевые слова
Конфликты с 32-разрядным (x86) компилятором