Sdílet prostřednictvím


_InterlockedCompareExchange128

Konkrétní společnosti Microsoft

Provádí porovnání šachtu 128bitové a serveru exchange.

unsigned char _InterlockedCompareExchange128(
   __int64 volatile * Destination,
   __int64 ExchangeHigh,
   __int64 ExchangeLow,
   __int64 * ComparandResult
);

Parametry

  • [v, out]Destination
    Za ukazatel na místo, což je pole celých čísel dva 64bitové pole 128bitové.Určení dat musí být 16 bajtů zarovnán k zamezení obecnou chybu ochrany.

  • [v]ExchangeHigh
    64Bitové celé číslo, které mohou být vyměňovány s vysokou část cílového.

  • [v]ExchangeLow
    64Bitové celé číslo, které může vyměňovat s dolní část cíl.

  • [v, out]ComparandResult
    Ukazatel na pole dvou celých čísel 64-bit (považovány za pole 128 bitů) pro porovnání s cíli.Na výstupu to je přepsána původní hodnota cíle.

Vrácená hodnota

1 Pokud 128bitové comparand rovná původní hodnota cíle.ExchangeHigha ExchangeLow přepsat cílový 128bitové.

0, pokud comparand se nerovná původní hodnota cíle.Hodnota cíle se nemění a přepíše hodnotu comparand s hodnotou cíle.

Požadavky

Vnitřní

Architektura

_InterlockedCompareExchange128

x64

Záhlaví souboru <intrin.h>

Poznámky

Tomto vnitřní generuje cmpxchg16b instrukce (s lock předpony) provést 128bitové uzamčené porovnat a exchange.Dřívější verze hardwaru AMD 64-bit nepodporují tuto operaci.Kontrola hardwaru podpora cmpxchg16b instrukce, volání __cpuid s vnitřní InfoType=0x00000001 (standard function 1).Bit 13 CPUInfo[2] (ECX) je 1, jestliže je tato instrukce podporována.

[!POZNÁMKA]

Hodnota ComparandResult vždy přepsán.Po lock instrukce tomto vnitřní okamžitě zkopíruje počáteční hodnotu Destination na ComparandResult.Z tohoto důvodu ComparandResult a Destination směřovat samostatné paměťových míst a předejít neočekávanému chování.

Přestože lze použít _InterlockedCompareExchange128 synchronizace nízkoúrovňové podproces nepotřebujete při použití funkce menší synchronizace synchronizovat více než 128 bitů (jako ostatní _InterlockedCompareExchange vnitřní objekty serveru) místo.Použití _InterlockedCompareExchange128 atomovou přístup 128bitové hodnoty v paměti.

Pokud spuštění kódu, který používá tomto vnitřní na hardware, který nepodporuje cmpxchg16b instrukce, jsou výsledky nepředvídatelné.

Tato rutina je k dispozici jako vnitřní.

Příklad

V tomto příkladu _InterlockedCompareExchange128 nahradit vysoké word pole celých čísel dva 64bitové součet jeho slova vysoké a nízké a zvýšit dolní slovo.Přístup k BigInt.Int array je atomovou, ale tento příklad využívá jeden podproces a ignoruje uzamčení pro jednoduchost.

// cmpxchg16b.c
// processor: x64
// compile with: /EHsc /O2
#include <stdio.h>
#include <intrin.h>

typedef struct _LARGE_INTEGER_128 {
    __int64 Int[2];
} LARGE_INTEGER_128, *PLARGE_INTEGER_128;

volatile LARGE_INTEGER_128 BigInt;

// This AtomicOp() function atomically performs:
//   BigInt.Int[1] += BigInt.Int[0]
//   BigInt.Int[0] += 1
void AtomicOp ()
{
    LARGE_INTEGER_128 Comparand;
    Comparand.Int[0] = BigInt.Int[0];
    Comparand.Int[1] = BigInt.Int[1];
    do {
        ; // nothing
    } while (_InterlockedCompareExchange128(BigInt.Int,
                                            Comparand.Int[0] + Comparand.Int[1],
                                            Comparand.Int[0] + 1,
                                            Comparand.Int) == 0);
}

// In a real application, several threads contend for the value
// of BigInt.
// Here we focus on the compare and exchange for simplicity.
int main(void)
{
   BigInt.Int[1] = 23;
   BigInt.Int[0] = 11;
   AtomicOp();
   printf("BigInt.Int[1] = %d, BigInt.Int[0] = %d\n",
      BigInt.Int[1],BigInt.Int[0]);
}
  

Konec konkrétní společnosti Microsoft

Copyright 2007 Advanced Micro zařízení, Inc. všechna práva vyhrazena.Reprodukována s oprávněním z Advanced Micro zařízení, Inc.

Viz také

Referenční dokumentace

Vnitřní funkce kompilátoru

_InterlockedCompareExchange vnitřní funkce

Konflikty s překladačem x86