_InterlockedExchangePointer 組み込み関数
Microsoft 固有の仕様
アトミック交換操作を実行し、2 番目の引数として渡されたアドレスを最初の引数にコピーして、最初の引数の元のアドレスを返します。
構文
void * _InterlockedExchangePointer(
void * volatile * Target,
void * Value
);
void * _InterlockedExchangePointer_acq(
void * volatile * Target,
void * Value
);
void * _InterlockedExchangePointer_rel(
void * volatile * Target,
void * Value
);
void * _InterlockedExchangePointer_nf(
void * volatile * Target,
void * Value
);
void * _InterlockedExchangePointer_HLEAcquire(
void * volatile * Target,
void * Value
);
void * _InterlockedExchangePointer_HLERelease(
void * volatile * Target,
void * Value
);
パラメーター
ターゲット
[in, out] 交換する値へのポインターへのポインター。 この関数は Value に値を設定し、その前の値を返します。
Value
[in] Target が指す値と交換する値。
戻り値
この関数は、Target が指す初期値を返します。
要件
Intrinsic | Architecture | ヘッダー |
---|---|---|
_InterlockedExchangePointer |
x86、ARM、x64、ARM64 | <intrin.h> |
_InterlockedExchangePointer_acq 、 _InterlockedExchangePointer_rel 、 _InterlockedExchangePointer_nf |
ARM、ARM64 | <intrin.h> |
_InterlockedExchangePointer_HLEAcquire , _InterlockedExchangePointer_HLERelease |
x64 | <immintrin.h> |
x86 アーキテクチャでは、_InterlockedExchangePointer
は _InterlockedExchange
を呼び出すマクロです。
解説
64 ビット システムではパラメーターは 64 ビットであり、64 ビットの境界に合わせて調整する必要があります。 これを行わなければ、関数は失敗します。 32 ビット システムではパラメーターは 32 ビットであり、32 ビットの境界に合わせて調整する必要があります。 詳細については、align に関するページを参照してください。
ARM プラットフォームでは、クリティカル セクションの最初と最後などで取得と解放のセマンティクスを必要とする場合は、_acq
および _rel
サフィックスの付いた組み込みを使用します。 組み込みで _nf
("no fence") サフィックスの付いたものは、メモリ バリアとして機能しません。
Hardware Lock Elision (HLE) 命令をサポートする Intel プラットフォームでは、_HLEAcquire
および _HLERelease
サフィックスの付いた組み込みにプロセッサへのヒントが含まれています。このヒントによりハードウェアでのロック書き込み手順を省くことで、パフォーマンスを向上させることができます。 HLE をサポートしていないプラットフォームでこれらの組み込みが呼び出された場合、ヒントは無視されます。
これらのルーチンは、組み込みとしてのみ使用できます。
Microsoft 固有の仕様はここまで