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


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

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

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

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] Addend
    Значение для сложения; заменяется результатом сложения.

  • [in] Value
    Значение для сложения.

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

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

Требования

Встроенная функция

Архитектура

Header

_InterlockedExchangeAdd, _InterlockedExchangeAdd8, _InterlockedExchangeAdd16, _InterlockedExchangeAdd64

x86, ARM, x64

<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

<intrin.h>

_InterlockedExchangeAdd_HLEAcquire, _InterlockedExchangeAdd_HLERelease, _InterlockedExchangeAdd64_HLEAcquire, _InterlockedExchangeAdd64_HLErelease

x86, 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 intrinsic . Невозможно использовать #pragma function на этих встроенных функций.

Пример

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

См. также

Ссылки

Встроенные объекты компилятора

Ключевые слова в C++

Конфликты с компилятором x86