_InterlockedDecrement の組み込み関数
[このドキュメントはプレビュー版であり、後のリリースで変更されることがあります。 Blank topics are included as placeholders.]
Microsoft 固有の仕様 →
Win32 Windows SDK InterlockedDecrement の関数にはコンパイラの組み込みサポートが用意されています。
long _InterlockedDecrement(
long * lpAddend
);
long _InterlockedDecrement_acq(
long * lpAddend
);
long _InterlockedDecrement_acq(
long * lpAddend
);
short _InterlockedDecrement16(
short * lpAddend
);
short _InterlockedDecrement16_acq(
short * lpAddend
);
short _InterlockedDecrement16_rel(
short * lpAddend
);
__int64 _InterlockedDecrement64(
__int64 * lpAddend
);
__int64 _InterlockedDecrement64_acq(
__int64 * lpAddend
);
__int64 _InterlockedDecrement64_rel(
__int64 * lpAddend
);
パラメーター
- [入力、出力] lpAddend
デクリメントする変数へのポインター。
戻り値
Windows 98Windows NT 4.0 (およびそれ以降 : 戻り値は一つの値です。
Windows 95Windows NT 3.51および前に : 操作の結果がの場合戻り値はになります。 演算の結果は未満の場合戻り値は負になりますが必ずしも結果と同じです。 操作の結果がゼロより大きい場合戻り値は正の数ですが必ずしも結果と同じです。
必要条件
組み込み |
アーキテクチャ |
---|---|
_InterlockedDecrement |
x86IPFx64 |
_InterlockedDecrement_acq |
IPF |
_InterlockedDecrement_rel |
IPF |
_InterlockedDecrement16 |
x86IPFx64 |
_InterlockedDecrement16_acq |
IPF |
_InterlockedDecrement16_rel |
IPF |
_InterlockedDecrement64 |
はx64 |
_InterlockedDecrement64_acq |
IPF |
_InterlockedDecrement64_rel |
IPF |
ヘッダー ファイル <intrin.h>
解説
リリースではセマンティクス使用することが含まれるかおよびプロセッサ固有または取得したりデータ型に基づいて異なる _InterlockedDecrement にいくつかのバリエーションがあります。
_InterlockedDecrement の関数が 32 ビット整数値を操作しますが**_InterlockedDecrement16** は16 ビットの整数値を操作し**_InterlockedDecrement64** は64 ビットの整数値を操作します。
_InterlockedDecrement_acq _InterlockedDecrement16_acq と _InterlockedDecrement64_acq の組み込み関数は _acq のサフィックスが操作の対応する関数が取得したりのセマンティクスを場合と同じです。クリティカル セクションに入るとき。
_InterlockedDecrement_rel _InterlockedDecrement16_rel と _InterlockedDecrement64_rel の組み込み関数は _rel のサフィックスが操作の対応する関数を使用すると便利リリースのセマンティクスは同じです。クリティカル セクションを離れる場合。
lpAddend のパラメーターが指す変数は32 ビット境界上に配置する必要があります。; それ以外の場合この関数はマルチプロセッサ システムで x86 および非 x86 オペレーティング システム上で失敗します。
これらの関数は読み書き可能メモリ バリアとして機能します。 詳細については_ReadWriteBarrier を参照してください。
これらのルーチンは組み込みとしてのみ使用できます。
使用例
// compiler_intrinsics_interlocked.cpp
// compile with: /Oi
#define _CRT_RAND_S
#include <cstdlib>
#include <cstdio>
#include <process.h>
#include <windows.h>
// To declare an interlocked function for use as an intrinsic,
// include intrin.h and put the function in a #pragma intrinsic
// statement.
#include <intrin.h>
#pragma intrinsic (_InterlockedIncrement)
// Data to protect with the interlocked functions.
volatile LONG data = 1;
void __cdecl SimpleThread(void* pParam);
const int THREAD_COUNT = 6;
int main() {
DWORD num;
HANDLE threads[THREAD_COUNT];
int args[THREAD_COUNT];
int i;
for (i = 0; i < THREAD_COUNT; i++) {
args[i] = i + 1;
threads[i] = reinterpret_cast<HANDLE>(_beginthread(SimpleThread, 0,
args + i));
if (threads[i] == reinterpret_cast<HANDLE>(-1))
// error creating threads
break;
}
WaitForMultipleObjects(i, threads, true, INFINITE);
}
// Code for our simple thread
void __cdecl SimpleThread(void* pParam) {
int threadNum = *((int*)pParam);
int counter;
unsigned int randomValue;
unsigned int time;
errno_t err = rand_s(&randomValue);
if (err == 0) {
time = (unsigned int) ((double) randomValue / (double) UINT_MAX * 500);
while (data < 100) {
if (data < 100) {
_InterlockedIncrement(&data);
printf_s("Thread %d: %d\n", threadNum, data);
}
Sleep(time); // wait up to half of a second
}
}
printf_s("Thread %d complete: %d\n", threadNum, data);
}