_InterlockedAnd funzioni intrinseche
Sezione specifica Microsoft
Usato per eseguire un'operazione atomica con AND bit per bit su una variabile condivisa da più thread.
Sintassi
long _InterlockedAnd(
long volatile * value,
long mask
);
long _InterlockedAnd_acq(
long volatile * value,
long mask
);
long _InterlockedAnd_HLEAcquire(
long volatile * value,
long mask
);
long _InterlockedAnd_HLERelease(
long volatile * value,
long mask
);
long _InterlockedAnd_nf(
long volatile * value,
long mask
);
long _InterlockedAnd_np(
long volatile * value,
long mask
);
long _InterlockedAnd_rel(
long volatile * value,
long mask
);
char _InterlockedAnd8(
char volatile * value,
char mask
);
char _InterlockedAnd8_acq(
char volatile * value,
char mask
);
char _InterlockedAnd8_nf(
char volatile * value,
char mask
);
char _InterlockedAnd8_np(
char volatile * value,
char mask
);
char _InterlockedAnd8_rel(
char volatile * value,
char mask
);
short _InterlockedAnd16(
short volatile * value,
short mask
);
short _InterlockedAnd16_acq(
short volatile * value,
short mask
);
short _InterlockedAnd16_nf(
short volatile * value,
short mask
);
short _InterlockedAnd16_np(
short volatile * value,
short mask
);
short _InterlockedAnd16_rel(
short volatile * value,
short mask
);
__int64 _InterlockedAnd64(
__int64 volatile* value,
__int64 mask
);
__int64 _InterlockedAnd64_acq(
__int64 volatile* value,
__int64 mask
);
__int64 _InterlockedAnd64_HLEAcquire(
__int64 volatile* value,
__int64 mask
);
__int64 _InterlockedAnd64_HLERelease(
__int64 volatile* value,
__int64 mask
);
__int64 _InterlockedAnd64_nf(
__int64 volatile* value,
__int64 mask
);
__int64 _InterlockedAnd64_np(
__int64 volatile* value,
__int64 mask
);
__int64 _InterlockedAnd64_rel(
__int64 volatile* value,
__int64 mask
);
Parametri
value
[in, out] Puntatore al primo operando, da sostituire con il risultato.
maschera
[in] Secondo operando.
Valore restituito
Valore originale del primo operando.
Requisiti
Intrinsic | Architettura | Intestazione |
---|---|---|
_InterlockedAnd , _InterlockedAnd8 , _InterlockedAnd16 |
x86, ARM, x64, ARM64 | <intrin.h> |
_InterlockedAnd64 |
ARM, x64, ARM64 | <intrin.h> |
_InterlockedAnd_acq , _InterlockedAnd_nf , , _InterlockedAnd8_acq _InterlockedAnd8_nf , _InterlockedAnd8_rel , _InterlockedAnd16_acq _InterlockedAnd16_rel _InterlockedAnd16_nf , , _InterlockedAnd64_nf _InterlockedAnd64_acq _InterlockedAnd_rel _InterlockedAnd64_rel |
ARM, ARM64 | <intrin.h> |
_InterlockedAnd_np , _InterlockedAnd8_np , _InterlockedAnd16_np _InterlockedAnd64_np |
x64 | <intrin.h> |
_InterlockedAnd_HLEAcquire , _InterlockedAnd_HLERelease , _InterlockedAnd64_HLEAcquire _InterlockedAnd64_HLERelease |
x86, x64 | <immintrin.h> |
Osservazioni:
Il numero nel nome di ogni funzione specifica la dimensione in bit degli argomenti.
Nelle piattaforme ARM e ARM64 usare gli intrinseci con _acq
e _rel
i suffissi per acquisire e rilasciare semantica, ad esempio all'inizio e alla fine di una sezione critica. Le funzioni intrinseche con suffisso _nf
("nessun limite") non fungono da barriera di memoria.
Le funzioni intrinseche con suffisso _np
("nessuna prelettura") impediscono l'inserimento di una possibile operazione di prelettura da parte del compilatore.
Sulle piattaforme Intel che supportano le istruzioni HLE (Hardware Lock Elision), le funzioni intrinseche con suffissi _HLEAcquire
e _HLERelease
includono un hint per il processore che consente di accelerare le prestazioni eliminando un passaggio di blocco scrittura nell'hardware. Se queste funzioni intrinseche vengono chiamate su piattaforme che non supportano HLE, l'hint viene ignorato.
Esempio
// InterlockedAnd.cpp
// Compile with: /Oi
#include <stdio.h>
#include <intrin.h>
#pragma intrinsic(_InterlockedAnd)
int main()
{
long data1 = 0xFF00FF00;
long data2 = 0x00FFFF00;
long retval;
retval = _InterlockedAnd(&data1, data2);
printf_s("0x%x 0x%x 0x%x", data1, data2, retval);
}
0xff00 0xffff00 0xff00ff00
Fine sezione specifica Microsoft