_InterlockedAnd systeminternen Funktionen
Microsoft-spezifisch
Zum Ausführen einer atomarischen bitweisen AND-Operation für eine Variable, die von mehreren Threads genutzt wird.
Syntax
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
);
Parameter
value
[in, out] Ein Zeiger auf den ersten Operanden, der durch das Ergebnis ersetzt werden soll.
mask
[in] Der zweite Operand.
Rückgabewert
Der ursprüngliche Wert des ersten Operanden.
Anforderungen
Intrinsic | Aufbau | Header |
---|---|---|
_InterlockedAnd , _InterlockedAnd8 _InterlockedAnd16 |
x86, ARM, x64, ARM64 | <intrin.h> |
_InterlockedAnd64 |
ARM, x64, ARM64 | <intrin.h> |
_InterlockedAnd_acq , _InterlockedAnd_nf , , _InterlockedAnd_rel , _InterlockedAnd8_acq , _InterlockedAnd8_rel _InterlockedAnd8_nf , _InterlockedAnd16_acq , _InterlockedAnd16_nf , , _InterlockedAnd16_rel , _InterlockedAnd64_acq , , _InterlockedAnd64_nf _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> |
Hinweise
Die Nummer im Namen jeder einzelnen Funktion gibt die Bitgröße der Argumente an.
Verwenden Sie auf ARM- und ARM64-Plattformen die systeminternen Mit _acq
- und _rel
Suffixe zum Abrufen und Freigeben der Semantik, z. B. am Anfang und Ende eines kritischen Abschnitts. Die systeminternen Funktionen mit einer _nf
-Suffix ("no fence") fungieren nicht als Speicherbarriere.
Die systeminternen Funktionen mit dem Suffix _np
(„no prefetch“) verhindern, dass ein möglicher Vorabrufvorgang vom Compiler eingefügt wird.
Auf Intel-Plattformen, die Hardware Lock Elision (HLE)-Anweisungen unterstützen, enthalten die systeminternen Funktionen mit den Suffixen _HLEAcquire
und _HLERelease
einen Hinweis für den Prozessor, wie die Leistung durch den Wegfall der Schreibsperre in der Hardware beschleunigt werden kann. Wenn diese systeminternen Funktionen auf Plattformen aufgerufen werden, die HLE nicht unterstützen, wird der Hinweis ignoriert.
Beispiel
// 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
Ende Microsoft-spezifisch