Поделиться через


_InterlockedCompareExchange128

Только для систем Microsoft

Выполняет 128 бит сравнивает предоставленный и обменивает.

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

Параметры

  • [in, out] Destination
    Указатель на массив назначения, 2 64 целые числа рассматриваемых в поле 128 бит. Данные назначения должны быть байтом 16 выравниванным, чтобы избежать общая ошибка защиты.

  • [входящий] ExchangeHigh
    64 - Целое число, которое может быть обменяно с высокой частью назначения.

  • [входящий] ExchangeLow
    64 - Целое число, которое может быть обменяно с нижней частью назначения.

  • [in, out] ComparandResult
    Указатель на массив 2 64 целые числа рассматриваемых в виде поля (128 бит), сравниваемый с назначением. На выходе, это заменено с исходным значением назначения.

Возвращаемое значение

Сравниваемый операнд 128 бит равен 1, если исходное значение. ExchangeHigh и ExchangeLow перезапись назначение 128 бит.

Сравниваемый операнд не равен 0, если исходное значение. Целевое значение не меняется и значение сравниваемый операнд заменено значением назначения.

Требования

Встроенный объект

Архитектура

_InterlockedCompareExchange128

x64

Файл заголовка <intrin.h>

Заметки

Этот встроенный создает инструкцию cmpxchg16b (с префиксом lock ) для выполнения блокирована 128 бит сравнивает и обменивает. Предыдущие версии оборудования AMD 64 не поддерживают эту инструкцию edition. Для проверки аппаратной поддержки для инструкции cmpxchg16b, вызовите внутреннего элемента __cpuid с InfoType=0x00000001 (standard function 1). Бит 13 CPUInfo[2](ECX) 1, если инструкция поддерживается.

Примечание

Значение ComparandResult всегда перезаписывается.После инструкции lock этот встроенный немедленно копирует начальное значение Destination к ComparandResult.По этой причине ComparandResult и Destination должны указывать для разделения областей памяти, чтобы избежать непредвиденной функциональности.

Хотя можно использовать для синхронизации потоков _InterlockedCompareExchange128 низкого уровня не требуется синхронизировать через 128 битами если можно использовать более малые функции синхронизации (как и другие встроенные функции _InterlockedCompareExchange ). Используйте _InterlockedCompareExchange128 если требуется является атомарным доступ к значению 128 бита в памяти.

Если запустить код, который использует этот встроенный на оборудовании, не поддерживает инструкцию cmpxchg16b результаты становятся непредсказуемыми.

Эта процедура доступна только в качестве внутреннего элемента.

Пример

В этом примере используется _InterlockedCompareExchange128, чтобы заменить высокое слово массива 2 64 целых чисел на сумму своих повсюду слов и увеличения низкое слово. Доступ к массиву BigInt.Int атомн, но в этом примере используется однозаходную поток и игнорирует блокировать для простоты.

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

ЭЛЕМЕНТ, относящийся Майкрософт

Авторские права 2007 предварительными микро- Устройствами, Inc все права защищены. Воспроизведено с разрешением от предварительных микро- Устройств, Inc

См. также

Ссылки

Встроенные объекты компилятора

_InterlockedCompareExchange Intrinsic Functions

Конфликты с компилятором x86