Partager via


fonctions intrinsèques _InterlockedXor

Section spécifique à Microsoft

Effectuer une opération ou exclusif (XOR) atomique au niveau du bit sur une variable partagée par plusieurs threads.

Syntaxe

long _InterlockedXor(
   long volatile * Value,
   long Mask
);
long _InterlockedXor_acq(
   long volatile * Value,
   long Mask
);
long _InterlockedXor_HLEAcquire(
   long volatile * Value,
   long Mask
);
long _InterlockedXor_HLERelease(
   long volatile * Value,
   long Mask
);
long _InterlockedXor_nf(
   long volatile * Value,
   long Mask
);
long _InterlockedXor_np(
   long volatile * Value,
   long Mask
);
long _InterlockedXor_rel(
   long volatile * Value,
   long Mask
);
char _InterlockedXor8(
   char volatile * Value,
   char Mask
);
char _InterlockedXor8_acq(
   char volatile * Value,
   char Mask
);
char _InterlockedXor8_nf(
   char volatile * Value,
   char Mask
);
char _InterlockedXor8_np(
   char volatile * Value,
   char Mask
);
char _InterlockedXor8_rel(
   char volatile * Value,
   char Mask
);
short _InterlockedXor16(
   short volatile * Value,
   short Mask
);
short _InterlockedXor16_acq(
   short volatile * Value,
   short Mask
);
short _InterlockedXor16_nf (
   short volatile * Value,
   short Mask
);
short _InterlockedXor16_np (
   short volatile * Value,
   short Mask
);
short _InterlockedXor16_rel(
   short volatile * Value,
   short Mask
);
__int64 _InterlockedXor64(
   __int64 volatile * Value,
   __int64 Mask
);
__int64 _InterlockedXor64_acq(
   __int64 volatile * Value,
   __int64 Mask
);
__int64 _InterlockedXor64_HLEAcquire(
   __int64 volatile * Value,
   __int64 Mask
);
__int64 _InterlockedXor64_HLERelease(
   __int64 volatile * Value,
   __int64 Mask
);
__int64 _InterlockedXor64_nf(
   __int64 volatile * Value,
   __int64 Mask
);
__int64 _InterlockedXor64_np(
   __int64 volatile * Value,
   __int64 Mask
);
__int64 _InterlockedXor64_rel(
   __int64 volatile * Value,
   __int64 Mask
);

Paramètres

Valeur
[in, out] Pointeur vers le premier opérande, à remplacer par le résultat.

Masque
[in] Deuxième opérande.

Valeur retournée

Valeur d’origine du premier opérande.

Spécifications

Intrinsic Architecture En-tête
_InterlockedXor, , _InterlockedXor8_InterlockedXor16 x86, ARM, x64, ARM64 <intrin.h>
_InterlockedXor64 ARM, x64, ARM64 <intrin.h>
_InterlockedXor_acq, , _InterlockedXor_nf, _InterlockedXor8_acq_InterlockedXor_rel, _InterlockedXor8_nf, _InterlockedXor8_rel, _InterlockedXor16_acq_InterlockedXor16_nf_InterlockedXor16_rel_InterlockedXor64_acq_InterlockedXor64_nf_InterlockedXor64_rel ARM, ARM64 <intrin.h>
_InterlockedXor_np, , _InterlockedXor8_np_InterlockedXor16_np, ,_InterlockedXor64_np x64 <intrin.h>
_InterlockedXor_HLEAcquire, _InterlockedXor_HLERelease x86, x64 <immintrin.h>
_InterlockedXor64_HLEAcquire, _InterlockedXor64_HLERelease x64 <immintrin.h>

Notes

Le nombre dans le nom de chaque fonction spécifie la taille en bits des arguments.

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 ARM avec un _nf suffixe (« sans clôture ») ne font pas office de barrière de mémoire.

Les fonctions intrinsèques avec un suffixe _np (pour « no prefetch », « pas de prérécupération ») empêchent l'insertion par le compilateur d'une possible opération de prérécupération.

Sur les plateformes Intel qui prennent en charge les instructions HLE (Hardware Lock Elision), les fonctions intrinsèques avec les suffixes _HLEAcquire et _HLERelease comprennent une indication pour le processeur qui peut accélérer les performances en éliminant une étape d'écriture de verrou dans le matériel. Si ces intrinsèques sont appelées sur des plateformes qui ne prennent pas en charge HLE, l’indicateur est ignoré.

Exemple

// _InterLockedXor.cpp
#include <stdio.h>
#include <intrin.h>

#pragma intrinsic(_InterlockedXor)

int main()
{
        long data1 = 0xFF00FF00;
        long data2 = 0x00FFFF00;
        long retval;
        retval = _InterlockedXor(&data1, data2);
        printf_s("0x%x 0x%x 0x%x", data1, data2, retval);
}
0xffff0000 0xffff00 0xff00ff00

FIN de la section spécifique à Microsoft

Voir aussi

Intrinsèques du compilateur
Conflits avec le compilateur x86