_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
);
パラメーター
Addend
[in、out] 加算される値。加算の結果によって置き換えられます。
Value
[in] 加算する値。
戻り値
戻り値は Addend
パラメーターが指す変数の初期値です。
要件
Intrinsic | Architecture | ヘッダー |
---|---|---|
_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
("no fence") のサフィックスの付いたものは、メモリ バリアとして機能しません。
Hardware Lock Elision (HLE) 命令をサポートする Intel プラットフォームでは、_HLEAcquire
および _HLERelease
サフィックスの付いた組み込みにプロセッサへのヒントが含まれています。このヒントによりハードウェアでのロック書き込み手順を省くことで、パフォーマンスを向上させることができます。 HLE をサポートしていないプラットフォームでこれらの組み込みが呼び出された場合、ヒントは無視されます。
これらのルーチンは、組み込みとしてのみ使用できます。 /Oi または #pragma intrinsic が使用されている場合でも、これらは組み込みです。 これらの組み込みで #pragma 関数を使用することはできません。
例
_InterlockedExchangeAdd
の使用例については、_InterlockedDecrement に関するページを参照してください。
Microsoft 固有の仕様はここまで