встроенные функции _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] Добавляемое значение; заменен результатом добавления.
Value
[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) компилятором