_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

Siehe auch

Systeminterne Compiler
Konflikt mit dem x86-Compiler