ロックおよびアトミック操作に関連する組込み関数

Itanium® アーキテクチャ用の組込み関数のプロトタイプは、ヘッダファイルia64intrin.h内にあります。

組込み関数 説明
unsigned __int64 _InterlockedExchange8(volatile unsigned char *Target, unsigned __int64 value) xchg1 命令に対応付けます。第1引数で指定されたアドレスに第2引数の最下位のバイトをアトミックに書きます。
unsigned __int64 _InterlockedCompareExchange8_rel(volatile unsigned char *Destination, unsigned __int64 Exchange, unsigned __int64 Comparand) 第1引数で指定されたアドレスの最下位のバイトをアトミックに比較/交換します。適切な設定のcmpxchg1.rel 命令に対応付けます。
unsigned __int64 _InterlockedCompareExchange8_acq(volatile unsigned char *Destination, unsigned __int64 Exchange, unsigned __int64 Comparand) 上記と同じですが、acquire セマンティックを使用します。
unsigned __int64 _InterlockedExchange16(volatile unsigned short *Target, unsigned __int64 value) xchg2 命令に対応付けます。第1引数で指定されたアドレスに第2引数の最下位のワードをアトミックに書きます。
unsigned __int64 _InterlockedCompareExchange16_rel(volatile unsigned short *Destination, unsigned __int64 Exchange, unsigned __int64 Comparand) 第1引数で指定されたアドレスの最下位のワードをアトミックに比較/交換します。適切な設定のcmpxchg2.rel 命令に対応付けます。
unsigned __int64 _InterlockedCompareExchange16_acq(volatile unsigned short *Destination, unsigned __int64 Exchange, unsigned __int64 Comparand) 上記と同じですが、acquire セマンティックを使用します。
int _InterlockedIncrement(volatile int *addend) 引数で指定された値を1ずつアトミックに増分します。fetchadd4 命令に対応付けます。
int _InterlockedDecrement(volatile int *addend) 引数で指定された値を1ずつアトミックに減分します。fetchadd4 命令に対応付けます。
int _InterlockedExchange(volatile int *Target, int value) 交換操作をアトミックに実行します。xchg4 命令に対応付けます。
int _InterlockedCompareExchange(volatile int *Destination, int Exchange, int Comparand) 適切な設定のcmpxchg4 命令に対応付けます。第1引数(32ビット・ポインタ)で指定された値をアトミックに比較/交換します。
int _InterlockedExchangeAdd(volatile int *addend, int increment) 比較/交換操作を使用して、加数に対して増分値をアトミックに加算します。cmpxchg4 命令を使用するループに対応付けられ、アトミックな性質が保証されます。
int _InterlockedAdd(volatile int *addend, int increment) 上記と同じですが、元の値ではなく、新しい値を返します。
void * _InterlockedCompareExchangePointer(void * volatile *Destination, void *Exchange, void *Comparand) exch8 命令を対応付けます。第1引数(すべての引数はポインタ)で指定されたポインタ値をアトミックに比較/交換します。
unsigned __int64 _InterlockedExchangeU(volatile unsigned int *Target, unsigned __int64 value) 第1引数で指定された32ビット・データをアトミックに交換します。xchg4 命令に対応付けます。
unsigned __int64 _InterlockedCompareExchange_rel(volatile unsigned int *Destination, unsigned __int64 Exchange, unsigned __int64 Comparand) 適切な設定のcmpxchg4.rel 命令に対応付けます。第1引数(64ビット・ポインタ)で指定された値をアトミックに比較/交換します。
unsigned __int64 _InterlockedCompareExchange_acq(volatile unsigned int *Destination, unsigned __int64 Exchange, unsigned __int64 Comparand) 上記と同じですが、cmpxchg4.acq 命令を対応付けます。
void _ReleaseSpinLock(volatile int *x) スピンロックを解放します。
__int64 _InterlockedIncrement64(volatile __int64 *addend) 引数で指定された値を1ずつ増分します。fetchadd命令に対応付けます。
__int64 _InterlockedDecrement64(volatile __int64 *addend) 引数で指定された値を1ずつ減分します。fetchadd命令に対応付けます。
__int64 _InterlockedExchange64(volatile __int64 *Target, __int64 value) 交換操作をアトミックに実行します。xchg 命令に対応付けます。
unsigned __int64 _InterlockedExchangeU64(volatile unsigned __int64 *Target, unsigned __int64 value) InterlockedExchange64と同じです(符号なしのデータ)。
unsigned __int64 _InterlockedCompareExchange64_rel(volatile unsigned __int64 *Destination, unsigned __int64 Exchange, unsigned __int64 Comparand) 適切な設定のcmpxchg.rel 命令に対応付けます。第1引数(64ビット・ポインタ)で指定された値をアトミックに比較/交換します。
unsigned __int64 _InterlockedCompareExchange64_acq(volatile unsigned __int64 *Destination, unsigned __int64 Exchange, unsigned __int64 Comparand) 適切な設定のcmpxchg.acq 命令に対応付けます。第1引数(64ビット・ポインタ)で指定された値をアトミックに比較/交換します。
__int64 _InterlockedCompareExchange64(volatile __int64 *Destination, __int64 Exchange, __int64 Comparand) 符号付きデータについては上記と同じです。
__int64 _InterlockedExchangeAdd64(volatile __int64 *addend, __int64 increment) 比較/交換操作を使用して、加数に対して増分値をアトミックに加算します。cmpxchg 命令を使用するループに対応付けられ、アトミックな性質を保証します。
__int64 _InterlockedAdd64(volatile __int64 *addend, __int64 increment); 上記と同じです。元の値ではなく、新しい値を返します。下記のを参照してください。
注:
_InterlockedSub64_InterlockedAdd64に基づいたマクロ定義として提供されています。
#define _InterlockedSub64(target, incr) _InterlockedAdd64((target),(-(incr))).

cmpxchgを使用して、targetに対してincr値をアトミックに減算します。cmpxchg 命令を使用するループに対応付けられ、アトミックな性質を保証します。