_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.