次の方法で共有


_InterlockedAdd 組み込み関数

Microsoft 固有の仕様

これらの関数はアトミック加算を実行します。これにより、複数のスレッドが共有変数にアクセスできる場合に操作が正常に完了します。

構文

long _InterlockedAdd(
   long volatile * Addend,
   long Value
);
long _InterlockedAdd_acq(
   long volatile * Addend,
   long Value
);
long _InterlockedAdd_nf(
   long volatile * Addend,
   long Value
);
long _InterlockedAdd_rel(
   long volatile * Addend,
   long Value
);
__int64 _InterlockedAdd64(
   __int64 volatile * Addend,
   __int64 Value
);
__int64 _InterlockedAdd64_acq(
   __int64 volatile * Addend,
   __int64 Value
);
__int64 _InterlockedAdd64_nf (
   __int64 volatile * Addend,
   __int64 Value
);
__int64 _InterlockedAdd64_rel(
   __int64 volatile * Addend,
   __int64 Value
);

パラメーター

Addend
[in, out] 加算される整数へのポインター。加算の結果によって置き換えられます。

Value
[in] 加算する値。

戻り値

どちらの関数も加算の結果を返します。

必要条件

Intrinsic アーキテクチャ
_InterlockedAdd ARM、ARM64
_InterlockedAdd_acq ARM、ARM64
_InterlockedAdd_nf ARM、ARM64
_InterlockedAdd_rel ARM、ARM64
_InterlockedAdd64 ARM、ARM64
_InterlockedAdd64_acq ARM、ARM64
_InterlockedAdd64_nf ARM、ARM64
_InterlockedAdd64_rel ARM、ARM64

ヘッダー ファイル<intrin.h>

解説

これらの関数の _acq または _rel サフィックスの付いたバージョンは、取得または解放のセマンティクスに従うインタロックされた加算を実行します。 取得のセマンティクスとは、その後のメモリの読み取りと書き込みの前に、演算の結果がすべてのスレッドおよびプロセッサから参照できるようになることを意味します。 クリティカル セクションを開始するときには、取得が役立ちます。 解放のセマンティクスは、演算の結果自体が参照できるようになる前に、すべてのメモリの読み取りと書き込みが強制的にすべてのスレッドとプロセッサから参照できるようになることを意味します。 クリティカル セクションを終了するときには、解放が役立ちます。 組み込みで _nf ("no fence") のサフィックスの付いたものは、メモリ バリアとして機能しません。

これらのルーチンは、組み込みとしてのみ使用できます。

例: _InterlockedAdd

// interlockedadd.cpp
// Compile with: /Oi /EHsc
// processor: ARM
#include <stdio.h>
#include <intrin.h>

#pragma intrinsic(_InterlockedAdd)

int main()
{
        long data1 = 0xFF00FF00;
        long data2 = 0x00FF0000;
        long retval;
        retval = _InterlockedAdd(&data1, data2);
        printf("0x%x 0x%x 0x%x", data1, data2, retval);
}

出力: _InterlockedAdd

0xffffff00 0xff0000 0xffffff00

例: _InterlockedAdd64

// interlockedadd64.cpp
// compile with: /Oi /EHsc
// processor: ARM
#include <iostream>
#include <intrin.h>
using namespace std;

#pragma intrinsic(_InterlockedAdd64)

int main()
{
        __int64 data1 = 0x0000FF0000000000;
        __int64 data2 = 0x00FF0000FFFFFFFF;
        __int64 retval;
        cout << hex << data1 << " + " << data2 << " = " ;
        retval = _InterlockedAdd64(&data1, data2);
        cout << data1 << endl;
        cout << "Return value: " << retval << endl;
}

出力: _InterlockedAdd64

ff0000000000 + ff0000ffffffff = ffff00ffffffff
Return value: ffff00ffffffff

Microsoft 固有の仕様はここまで

関連項目

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