Udostępnij za pośrednictwem


_InterlockedAdd — funkcje wewnętrzne

Specyficzne dla firmy Microsoft

Wykonaj częściowych dodatek, który zapewnia, że operacja zakończy się pomyślnie po wiele wątków mają dostęp do udostępnionego zmiennej.

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

  • [w, out] Addend
    Wskaźnik do liczby całkowitej, które mają zostać dodane do; zastępuje wynik dodanie.

  • [w] Value
    Wartość do dodania.

Wartość zwracana

Obie funkcje zwracają wynik dodanie.

Wymagania

Wewnętrzne

Architektura

_InterlockedAdd

ARM

_InterlockedAdd_acq

ARM

_InterlockedAdd_nf

ARM

_InterlockedAdd_rel

ARM

_InterlockedAdd64

ARM

_InterlockedAdd64_acq

ARM

_InterlockedAdd64_nf

ARM

_InterlockedAdd64_rel

ARM

Nagłówka pliku < intrin.h >

Uwagi

Wersje tych funkcji z _acq lub _rel sufiksy wykonać zazębione dodatek po semantyki pobierania lub wersję.Licencje semantyki oznacza, że wyniki operacji są widoczne wszystkie wątki i procesory przed wszystkie kolejne pamięci odczytuje i zapisuje.Licencje przydaje się podczas wprowadzania krytyczne sekcji.Semantyki wersji oznacza, że wszystkie pamięć odczyty i zapisy są wymuszone jego były widoczne wszystkie wątki i procesory, zanim wynik operacji zostaje wyświetlona automatycznie.Wersja jest przydatne, gdy opuszczania krytyczne sekcji.Intrinsics z _nf sufiks ("nie ogrodzenia") nie działają jako barierę pamięci.

Procedury te są dostępne tylko jako intrinsics.

Przykład

// 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);
}

// 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;
}

Dane wyjściowe

0xffffff00 0xff0000 0xffffff00

Dane wyjściowe

ff0000000000 + ff0000ffffffff = ffff00ffffffff
Return value: ffff00ffffffff

Zobacz też

Informacje

Funkcje wewnętrzne kompilatora

Konflikty z kompilator x 86