_InterlockedDecrement fonctions intrinsèques

Fournit la prise en charge intrinsèque du compilateur pour la fonction InterlockedDecrement du SDK Windows Win32. Les _InterlockedDecrement fonctions intrinsèques sont spécifiques à Microsoft.

Syntaxe

long _InterlockedDecrement(
   long volatile * lpAddend
);
long _InterlockedDecrement_acq(
   long volatile * lpAddend
);
long _InterlockedDecrement_rel(
   long volatile * lpAddend
);
long _InterlockedDecrement_nf(
   long volatile * lpAddend
);
short _InterlockedDecrement16(
   short volatile * lpAddend
);
short _InterlockedDecrement16_acq(
   short volatile * lpAddend
);
short _InterlockedDecrement16_rel(
   short volatile * lpAddend
);
short _InterlockedDecrement16_nf(
   short volatile * lpAddend
);
__int64 _InterlockedDecrement64(
   __int64 volatile * lpAddend
);
__int64 _InterlockedDecrement64_acq(
   __int64 volatile * lpAddend
);
__int64 _InterlockedDecrement64_rel(
   __int64 volatile * lpAddend
);
__int64 _InterlockedDecrement64_nf(
   __int64 volatile * lpAddend
);

Paramètres

lpAddend
[in, out] Pointeur volatile vers la variable à décrémenter.

Valeur retournée

La valeur de retour est la valeur décrémentée résultante.

Spécifications

Intrinsic Architecture
_InterlockedDecrement, _InterlockedDecrement16 x86, ARM, x64, ARM64
_InterlockedDecrement64 ARM, x64, ARM64
_InterlockedDecrement_acq, , _InterlockedDecrement_rel, _InterlockedDecrement16_acq_InterlockedDecrement_nf, , _InterlockedDecrement16_nf_InterlockedDecrement64_nf_InterlockedDecrement64_acq_InterlockedDecrement64_rel_InterlockedDecrement16_rel ARM, ARM64

Fichier<d’en-tête intrin.h>

Notes

Il existe plusieurs variantes de _InterlockedDecrement qui varient selon les types de données qu’elles impliquent et l’utilisation d’une sémantique acquire ou release spécifique au processeur.

La fonction _InterlockedDecrement opère sur des valeurs entières de 32 bits, _InterlockedDecrement16 sur des valeurs entières de 16 bits et _InterlockedDecrement64 sur des valeurs entières de 64 bits.

Sur les plateformes ARM, utilisez les fonctions intrinsèques avec des suffixes _acq et _rel si vous devez acquérir et libérer des éléments de la sémantique, comme le début et la fin d’une section critique. Les intrinsèques avec un _nf suffixe (« sans clôture ») ne font pas office de barrière de mémoire.

La variable vers laquelle pointe le paramètre lpAddend doit être alignée sur une limite de 32 bits. Dans le cas contraire, cette fonction échoue sur les systèmes x86 multiprocesseurs et les systèmes autres que x86. Pour plus d’informations, consultez Aligner.

Ces routines sont disponibles seulement comme fonctions intrinsèques.

Exemple

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

Voir aussi

Intrinsèques du compilateur
Mots clés
Conflits avec le compilateur x86