Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Stellt systeminterne Compilerunterstützung für die Win32 Windows SDK InterlockedDecrement-Funktion bereit. Die _InterlockedDecrement
systeminternen Funktionen sind microsoftspezifisch.
Syntax
long _InterlockedDecrement(
long volatile * lpAddend
);
long _InterlockedDecrement_acq(
long volatile * lpAddend
);
long _InterlockedDecrement_rel(
long volatile * lpAddend
);
long _InterlockedDecrement_nf(
long volatile * lpAddend
);
short _InterlockedDecrement16(
short volatile * lpAddend
);
short _InterlockedDecrement16_acq(
short volatile * lpAddend
);
short _InterlockedDecrement16_rel(
short volatile * lpAddend
);
short _InterlockedDecrement16_nf(
short volatile * lpAddend
);
__int64 _InterlockedDecrement64(
__int64 volatile * lpAddend
);
__int64 _InterlockedDecrement64_acq(
__int64 volatile * lpAddend
);
__int64 _InterlockedDecrement64_rel(
__int64 volatile * lpAddend
);
__int64 _InterlockedDecrement64_nf(
__int64 volatile * lpAddend
);
Parameter
lpAddend
[in, out] Veränderliche Zeiger auf die Variable, die dekrementiert werden soll.
Rückgabewert
Der Rückgabewert ist der resultierende verringerte Wert.
Anforderungen
Intrinsic | Aufbau |
---|---|
_InterlockedDecrement , _InterlockedDecrement16 |
x86, ARM, x64, ARM64 |
_InterlockedDecrement64 |
ARM, x64, ARM64 |
_InterlockedDecrement_acq , _InterlockedDecrement_rel , , _InterlockedDecrement16_acq _InterlockedDecrement_nf , _InterlockedDecrement16_rel , _InterlockedDecrement16_nf , _InterlockedDecrement64_acq , , , _InterlockedDecrement64_rel , , _InterlockedDecrement64_nf |
ARM, ARM64 |
Headerdatei<intrin.h>
Hinweise
Es gibt mehrere Varianten von _InterlockedDecrement
, die sich basierend auf den beinhalteten Datentypen und in Abhängigkeit davon unterscheiden, ob prozessorspezifische Semantiken zum Abrufen bzw. Freigeben verwendet werden.
Während die _InterlockedDecrement
-Funktion mit 32-Bit-Ganzzahlwerten arbeitet, verwendet _InterlockedDecrement16
16-Bit-Ganzzahlwerte und _InterlockedDecrement64
64-Bit-Ganzzahlwerte.
Verwenden Sie auf ARM-Plattformen die systeminternen Funktionen mit den Suffixen _acq
und _rel
, wenn Sie Semantiken zum Abrufen bzw. Freigeben benötigen, wie am Anfang und Ende eines kritischen Abschnitts. Die Systeminternen mit einem _nf
Suffix ("kein Zaun") wirken nicht als Speicherbarriere.
Die Variable, auf die der lpAddend
-Parameter zeigt, muss an einer 32-Bit-Grenze ausgerichtet sein; andernfalls schlägt diese Funktion auf x86-Multiprozessorsystemen und allen Nicht-x86-Systemen fehl. Weitere Informationen finden Sie unter "Ausrichten".
Diese Routinen sind nur als systeminterne Funktionen verfügbar.
Beispiel
// compiler_intrinsics_interlocked.cpp
// compile with: /Oi
#define _CRT_RAND_S
#include <cstdlib>
#include <cstdio>
#include <process.h>
#include <windows.h>
// To declare an interlocked function for use as an intrinsic,
// include intrin.h and put the function in a #pragma intrinsic
// statement.
#include <intrin.h>
#pragma intrinsic (_InterlockedIncrement)
// Data to protect with the interlocked functions.
volatile LONG data = 1;
void __cdecl SimpleThread(void* pParam);
const int THREAD_COUNT = 6;
int main() {
DWORD num;
HANDLE threads[THREAD_COUNT];
int args[THREAD_COUNT];
int i;
for (i = 0; i < THREAD_COUNT; i++) {
args[i] = i + 1;
threads[i] = reinterpret_cast<HANDLE>(_beginthread(SimpleThread, 0,
args + i));
if (threads[i] == reinterpret_cast<HANDLE>(-1))
// error creating threads
break;
}
WaitForMultipleObjects(i, threads, true, INFINITE);
}
// Code for our simple thread
void __cdecl SimpleThread(void* pParam) {
int threadNum = *((int*)pParam);
int counter;
unsigned int randomValue;
unsigned int time;
errno_t err = rand_s(&randomValue);
if (err == 0) {
time = (unsigned int) ((double) randomValue / (double) UINT_MAX * 500);
while (data < 100) {
if (data < 100) {
_InterlockedIncrement(&data);
printf_s("Thread %d: %d\n", threadNum, data);
}
Sleep(time); // wait up to half of a second
}
}
printf_s("Thread %d complete: %d\n", threadNum, data);
}
Siehe auch
Intrinsische Compilerfunktionen
Schlüsselwörter
Konflikt mit dem x86-Compiler