_InterlockedDecrement
fungsi intrinsik
Menyediakan dukungan intrinsik pengkompilasi untuk fungsi Win32 Windows SDK InterlockedDecrement . Fungsi _InterlockedDecrement
intrinsik khusus Microsoft.
Sintaks
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
[masuk, keluar] Penunjuk volatil ke variabel yang akan diderementasi.
Nilai hasil
Nilai yang dikembalikan adalah nilai yang direkrementasi yang dihasilkan.
Persyaratan
Intrinsik | Arsitektur |
---|---|
_InterlockedDecrement , _InterlockedDecrement16 |
x86, ARM, x64, ARM64 |
_InterlockedDecrement64 |
ARM, x64, ARM64 |
_InterlockedDecrement_acq , _InterlockedDecrement_rel , _InterlockedDecrement_nf , _InterlockedDecrement16_acq , _InterlockedDecrement16_rel , _InterlockedDecrement16_nf , _InterlockedDecrement64_acq , _InterlockedDecrement64_rel , _InterlockedDecrement64_nf , |
ARM, ARM64 |
File header<intrin.h>
Keterangan
Ada beberapa variasi pada _InterlockedDecrement
yang bervariasi berdasarkan jenis data yang mereka libatkan dan apakah semantik peroleh atau rilis khusus prosesor digunakan.
_InterlockedDecrement
Sementara fungsi beroperasi pada nilai bilangan bulat 32-bit, _InterlockedDecrement16
beroperasi pada nilai bilangan bulat 16-bit dan _InterlockedDecrement64
beroperasi pada nilai bilangan bulat 64-bit.
Pada platform ARM, gunakan intrinsik dengan _acq
akhiran dan _rel
jika Anda perlu memperoleh dan melepaskan semantik, seperti di awal dan akhir bagian penting. Intrinsik dengan _nf
akhiran ("tanpa pagar") tidak bertindak sebagai pengralang memori.
Variabel yang diarahkan oleh lpAddend
parameter harus diselaraskan pada batas 32-bit; jika tidak, fungsi ini gagal pada sistem x86 multiprosedur dan sistem non-x86 apa pun. Untuk informasi selengkapnya, lihat meratakan.
Rutinitas ini hanya tersedia sebagai intrinsik.
Contoh
// 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);
}
Baca juga
Intrinsik pengkompilasi
Kata kunci
Konflik dengan Pengkompilasi x86
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk