_InterlockedAdd の組み込み関数
[このドキュメントはプレビュー版であり、後のリリースで変更されることがあります。 Blank topics are included as placeholders.]
Microsoft 固有の仕様 →
複数のスレッドが共有変数にアクセスできる場合操作が正常に完了したことを確認するアトミック加算を実行します。
long _InterlockedAdd(
long volatile * Addend,
long Value
);
long _InterlockedAdd_acq(
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_rel(
__int64 volatile * Addend,
__int64 Value
);
パラメーター
[入力、出力] Addend
に追加する整数へのポインター。; 加算結果に置き換えられます。[入力] Value
追加する値。
戻り値
関数は両方の加算した結果を返します。
必要条件
組み込み |
アーキテクチャ |
---|---|
_InterlockedAdd |
IPF |
_InterlockedAdd_acq |
IPF |
_InterlockedAdd_rel |
IPF |
_InterlockedAdd64 |
IPF |
_InterlockedAdd64_acq |
IPF |
_InterlockedAdd64_rel |
IPF |
ヘッダー ファイル <intrin.h>
解説
_acq または _rel のサフィックスが付いているこれらの関数の各バージョンはインタロック追加の後を取得または解放しますセマンティクスを実行します。 操作の結果がすべてのスレッドから参照できるようにし後続のメモリのプロセッサが書き込みを行うことを意味する場合があります。 クリティカル セクションに入るとき Acquire 便利です。 リリースの意味は操作の結果で参照できるようにが終了する前にすべてのメモリを読み取る書き込みがすべてのスレッドのプロセッサから参照できるようにするために変換されることを意味します。 リリースではクリティカル セクションを保持する場合に便利です。
これらの関数は読み書き可能メモリ バリアとして機能します。 詳細については_ReadWriteBarrier を参照してください。
これらのルーチンは組み込みとしてのみ使用できます。
使用例
// interlockedadd.cpp
// Compile with: /Oi /EHsc
// processor: IPF
#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);
}
// interlockedadd64.cpp
// compile with: /Oi /EHsc
// processor: IPF
#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;
}
出力
0xffffff00 0xff0000 0xffffff00
出力
ff0000000000 + ff0000ffffffff = ffff00ffffffff
Return value: ffff00ffffffff