Condividi tramite


_InterlockedCompareExchange128

Specifici di Microsoft

Esegue i 128 che il bit collegato confronta e che scambia.

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

Parametri

  • [in, out] Destination
    Puntatore alla destinazione, ovvero una matrice di due numeri interi a 64 bit considerati come campo di bit 128. I dati di destinazione devono essere 16 byte allineato per evitare un errore di protezione generale.

  • [in] ExchangeHigh
    Un Integer a 64 bit che può essere scambiato con la parte superiore della destinazione.

  • [in] ExchangeLow
    Un Integer a 64 bit che può essere scambiato con la parte inferiore della destinazione.

  • [in, out] ComparandResult
    Puntatore a matrice di due numeri interi a 64 bit (considerati come campo di bit 128) da confrontare con la destinazione. In output, questo viene sostituito con il valore originale della destinazione.

Valore restituito

1 se il comparand a 128 bit è uguale al valore originale della destinazione. ExchangeHigh e ExchangeLow sovrascrivono la destinazione di 128 bit.

0 se il comparand non è uguale al valore originale della destinazione. Il valore di destinazione è invariato e il valore di comparand viene sostituito dal valore di destinazione.

Requisiti

Intrinseco

Architettura

_InterlockedCompareExchange128

x64

File di intestazione <intrin.h>

Note

Questa funzione intrinseca genera l'istruzione dicmpxchg16b con il prefisso di lock ) eseguire i 128 che il bit bloccato confronta e che scambia. Le versioni precedenti hardware a 64 bit AMD non supportano questa istruzione. Per verificare il supporto hardware all'istruzione di cmpxchg16b, chiamare la funzione intrinseca di __cpuid con InfoType=0x00000001 (standard function 1). Le applicazioni a 13 bit di CPUInfo[2](ECX) è 1 se l'istruzione è supportata.

Nota

Il valore di ComparandResult viene sovrascritto sempre.Dopo l'istruzione di lock , questa funzione intrinseca immediatamente copia il valore iniziale di Destination a ComparandResult.Per questo motivo, ComparandResult e Destination devono puntare per separare le posizioni di memoria per evitare il comportamento imprevisto.

Sebbene sia possibile utilizzare _InterlockedCompareExchange128 per la sincronizzazione dei thread di basso livello, non è necessario sincronizzare oltre 128 bit se è possibile utilizzare le funzioni più piccole di sincronizzazione (come le altre funzioni intrinseche di _InterlockedCompareExchange ). Utilizzare _InterlockedCompareExchange128 se si desidera accedere in modalità atomica su un valore pari a 128 bit in memoria.

Se si esegue il codice che utilizza questa funzione intrinseca sull'hardware che non supporta l'istruzione di cmpxchg16b , i risultati sono imprevedibili.

Questa procedura è disponibile solo come intrinseci.

Esempio

In questo esempio viene utilizzato _InterlockedCompareExchange128 per sostituire il word alto di una matrice di due numeri interi a 64 bit con la somma del livello e word bassi e per incrementare il word basso. L'accesso alla matrice di BigInt.Int viene utilizzato esempio di questo, ma atomici un singolo thread e ignora il blocco per la semplicità.

// 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 FINALE specifico

Copyright 2007 da Advanced Micro Devices, inc tutti i diritti riservati. Riprodotto con l'autorizzazione di Advanced Micro Devices, inc

Vedere anche

Riferimenti

Intrinseci del compilatore

_InterlockedCompareExchange Intrinsic Functions

Conflitti con il compilatore x86