Sdílet prostřednictvím


vnitřní funkce _InterlockedAdd

Specifické pro Microsoft

Tyto funkce provádějí atomické sčítání, což zajišťuje úspěšné dokončení operace, pokud má více než jedno vlákno přístup ke sdílené proměnné.

Syntaxe

long _InterlockedAdd(
   long volatile * Addend,
   long Value
);
long _InterlockedAdd_acq(
   long volatile * Addend,
   long Value
);
long _InterlockedAdd_nf(
   long volatile * Addend,
   long Value
);
long _InterlockedAdd_rel(
   long volatile * Addend,
   long Value
);
__int64 _InterlockedAdd64(
   __int64 volatile * Addend,
   __int64 Value
);
__int64 _InterlockedAdd64_acq(
   __int64 volatile * Addend,
   __int64 Value
);
__int64 _InterlockedAdd64_nf (
   __int64 volatile * Addend,
   __int64 Value
);
__int64 _InterlockedAdd64_rel(
   __int64 volatile * Addend,
   __int64 Value
);

Parametry

Druhý sčítanec
[in, out] Ukazatel na celé číslo, ke které se má přidat; nahrazeno výsledkem sčítání.

Hodnota
[v] Hodnota, kterou chcete přidat.

Vrácená hodnota

Obě funkce vrátí výsledek sčítání.

Požadavky

Vnitřní Architektura
_InterlockedAdd ARM, ARM64
_InterlockedAdd_acq ARM, ARM64
_InterlockedAdd_nf ARM, ARM64
_InterlockedAdd_rel ARM, ARM64
_InterlockedAdd64 ARM, ARM64
_InterlockedAdd64_acq ARM, ARM64
_InterlockedAdd64_nf ARM, ARM64
_InterlockedAdd64_rel ARM, ARM64

Hlavičkový soubor<intrin.h>

Poznámky

Verze těchto funkcí s _acq příponou nebo _rel příponou provádějí vzájemné přidání po získání nebo vydání sémantiky. Získání sémantiky znamená, že výsledek operace je viditelný pro všechna vlákna a procesory před jakýmkoli pozdějším čtením a zápisy paměti. Získání je užitečné při zadávání kritické části. Sémantika vydané verze znamená, že všechny čtení a zápisy paměti jsou nuceny být viditelné pro všechna vlákna a procesory předtím, než se výsledek operace zobrazí sám. Vydání je užitečné při opuštění kritické části. Vnitřní objekty s příponou _nf (bez plotu) nefungují jako paměťová bariéra.

Tyto rutiny jsou k dispozici pouze jako vnitřní objekty.

Příklad: _InterlockedAdd

// interlockedadd.cpp
// Compile with: /Oi /EHsc
// processor: ARM
#include <stdio.h>
#include <intrin.h>

#pragma intrinsic(_InterlockedAdd)

int main()
{
        long data1 = 0xFF00FF00;
        long data2 = 0x00FF0000;
        long retval;
        retval = _InterlockedAdd(&data1, data2);
        printf("0x%x 0x%x 0x%x", data1, data2, retval);
}

Výstup: _InterlockedAdd

0xffffff00 0xff0000 0xffffff00

Příklad: _InterlockedAdd64

// interlockedadd64.cpp
// compile with: /Oi /EHsc
// processor: ARM
#include <iostream>
#include <intrin.h>
using namespace std;

#pragma intrinsic(_InterlockedAdd64)

int main()
{
        __int64 data1 = 0x0000FF0000000000;
        __int64 data2 = 0x00FF0000FFFFFFFF;
        __int64 retval;
        cout << hex << data1 << " + " << data2 << " = " ;
        retval = _InterlockedAdd64(&data1, data2);
        cout << data1 << endl;
        cout << "Return value: " << retval << endl;
}

Výstup: _InterlockedAdd64

ff0000000000 + ff0000ffffffff = ffff00ffffffff
Return value: ffff00ffffffff

END Microsoft Specific

Viz také

Vnitřní funkce kompilátoru
Konflikty s kompilátorem x86