_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
);

パラメーター

Target
[in, out] 交換する値へのポインターへのポインター。 この関数は Value に値を設定し、その前の値を返します。

Value
[in] Target が指す値と交換する値。

戻り値

この関数は、Target が指す初期値を返します。

必要条件

Intrinsic アーキテクチャ ヘッダー
_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 固有の仕様はここまで

関連項目

コンパイラの組み込み
x86 コンパイラとの競合