Partager via


fonctions intrinsèques _InterlockedAdd

Section spécifique à Microsoft

Ces fonctions effectuent un ajout atomique, ce qui garantit que l’opération se termine correctement lorsque plusieurs threads ont accès à une variable partagée.

Syntaxe

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

Paramètres

Addend
[in, out] Pointeur vers l’entier à ajouter ; remplacé par le résultat de l’ajout.

Valeur
[in] Valeur à ajouter.

Valeur retournée

Ces deux fonctions renvoient le résultat de l'addition.

Spécifications

Intrinsic Architecture
_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

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

Notes

Les versions de ces fonctions avec le suffixe _acq ou _rel effectuent une addition verrouillée respectant la sémantique acquire ou release. Acquérir la sémantique signifie que le résultat de l’opération est rendu visible par tous les threads et processeurs avant toute lecture et écriture de mémoire ultérieure. Elle est utile lors de l'entrée d'une section critique. La sémantique de mise en production signifie que toutes les lectures et écritures de mémoire sont forcées d’être rendues visibles par tous les threads et processeurs avant que le résultat de l’opération soit rendu visible lui-même. Elle est utile quand vous quittez une section critique. Les intrinsèques avec un _nf suffixe (« sans clôture ») ne font pas office de barrière de mémoire.

Ces routines sont disponibles seulement comme fonctions intrinsèques.

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

Sortie : _InterlockedAdd

0xffffff00 0xff0000 0xffffff00

Exemple : _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;
}

Sortie : _InterlockedAdd64

ff0000000000 + ff0000ffffffff = ffff00ffffffff
Return value: ffff00ffffffff

FIN de la section spécifique à Microsoft

Voir aussi

Intrinsèques du compilateur
Conflits avec le compilateur x86