Freigeben über


_InterlockedCompareExchange128

Microsoft-spezifisch

Führt ein ineinandergegriffenes 128-Bit vergleichen und austauschen.

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

Parameter

  • [in, out] Destination
    Zeiger auf das Ziel, das ein Array von zwei 64-Bit-Ganzzahlen ist, die ein 128-Bit-Feld angesehen werden. Die Daten müssen das Ziel 16-Byte ausgerichtet werden, um eine allgemeine Schutzverletzung zu vermeiden.

  • [in] ExchangeHigh
    Eine 64-Bit-Ganzzahl, die mit dem hohen Teil des Ziels ausgetauscht werden.

  • [in] ExchangeLow
    Eine 64-Bit-Ganzzahl, die mit dem Basis- Teil des Ziels ausgetauscht werden.

  • [in, out] ComparandResult
    Zeiger auf ein Array von zwei zu vergleichenden 64-Bit-Ganzzahlen mit dem Ziel betrachtet (als 128-Bit-Feld). Das Ergebnis ist dies mit dem ursprünglichen Wert des Ziels überschrieben.

Rückgabewert

1, wenn der 128-Bit Comparand den ursprünglichen Wert des Ziels entspricht. ExchangeHighExchangeLow und überschreiben die 128-Bit-Ziel.

0, wenn der Comparand nicht zum ursprünglichen Wert des Ziels entspricht. Der Wert des Ziels bleibt unverändert, und der Wert des Comparand wird mit dem Wert des Ziels überschrieben.

Anforderungen

Intrinsisch

Architektur

_InterlockedCompareExchange128

x64

Headerdatei <intrin.h>

Hinweise

Diese systeminternen Funktion generiert die cmpxchg16b-Anweisung (mit dem Präfix) lock ein gesperrtes 128-Bit auszuführen vergleichen und austauschen. Frühere Versionen von AMD-64-Bit-Hardware diese Anweisung nicht unterstützt. Um für Hardwareunterstützung für die cmpxchg16b-Anweisung zu überprüfen, rufen Sie die __cpuid systeminterne Funktion mit InfoType=0x00000001 (standard function 1) an. Bit 13 von CPUInfo[2](ECX) beträgt 1, wenn die Anweisung unterstützt wird.

Hinweis

Der Wert von ComparandResult wird immer außer Kraft.Nach der lock-Anweisung kopiert diese systeminterne Funktion sofort den Anfangswert von Destination zu ComparandResult.Aus diesem Grund sollten ComparandResult und Destination zeigen, um Speicheradressen zu trennen, um ein unerwartetes Verhalten zu vermeiden.

Obwohl Sie _InterlockedCompareExchange128 für die Threadsynchronisierung verwenden können, ist es nicht erforderlich, um über 128 Bits zu synchronisieren, wenn Sie können stattdessen Synchronisierung kleinere Funktionen (wie die anderen _InterlockedCompareExchange systeminternen Funktionen). Verwenden Sie _InterlockedCompareExchange128, wenn Sie atomaren Zugriff auf einem 128-Bit-Wert im Arbeitsspeicher soll.

Wenn Sie Code ausführen, der diese systeminterne Funktion auf Hardware verwendet, die nicht die cmpxchg16b-Anweisung unterstützt, die Ergebnisse sind unvorhersehbar.

Diese Routine ist nur als systeminterne Funktion zur Verfügung.

Beispiel

In diesem Beispiel wird _InterlockedCompareExchange128, um das hohe WORD eines Arrays von zwei 64-Bit-Ganzzahlen durch die Summe der hohen und niedrigen Wörter zu ersetzen und das niedrige WORD zu erhöhen. Der Zugriff auf den BigInt.Int-Array atomar, ist aber dieses Beispiel verwendet einen einzelnen Thread und ignoriert der Einfachheit halber sperren.

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

Microsoft ENDES bestimmten

Copyright 2007 bis Advanced Micro Devices, Inc alle Rechte vorbehalten. Reproduziert mit zulässigen Advanced Micro Devices, Inc

Siehe auch

Referenz

Intrinsische Compilerfunktionen

_InterlockedCompareExchange Intrinsic Functions

Konflikt mit dem x86-Compiler