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

参照

Reference

コンパイラ組み込み関数。

C++ キーワード

その他の技術情報

Conflicts with the x86 Compiler