_InterlockedCompareExchange128

Microsoft 专用

执行互锁的 128 位比较和交换。

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

参数

  • [in, out] Destination
    对目标的指针,是 128 位域考虑的两个 64 位整数。 目标数据必须是对齐的 16 字节避免了通用保护错误。

  • [in] ExchangeHigh
    可以交换使用该目标的高部分的 64 位整数。

  • [in] ExchangeLow
    可以交换使用该目标的下半部分的 64 位整数。

  • [in, out] ComparandResult
    对的指针两个 64 位整数 (视为 128 位域) 和目标进行比较。 在输出,则将复盖为目标的初始值。

返回值

1,如果 128 位的相等比较为目标的初始值。 ExchangeHigh 和 ExchangeLow 复盖 128 位目标。

0,如果此比较线程不等于该目标的初始值。 为目标的值未更改,并且该比较数的值将复盖为目标的值。

要求

内部

体系结构

_InterlockedCompareExchange128

x64

头文件 <intrin.h>

备注

此内部生成cmpxchg16b 命令 (与 lock 标题) 执行被锁定的 128 位比较和交换。 AMD 64 位硬件的早期版本不支持该命令。 若要检查硬件为 cmpxchg16b命令支持,调用与 InfoType=0x00000001 (standard function 1)的 __cpuid 内部。 bit 的 13 CPUInfo[2](ECX) 是 1,则命令支持。

备注

ComparandResult 的值始终被复盖。在 lock 命令后,此内部即时复制 Destination 的初始值为 ComparandResult。因此, ComparandResult 和 Destination 应指向分隔内存位置避免意外行为。

虽然您可以为低级别线程同步使用 _InterlockedCompareExchange128 ,则无需同步 128 位,则可以使用更小的同步功能 (例如其他 _InterlockedCompareExchange 内部)。 ,如果需要对 128 位值的基本访问内存,请使用 _InterlockedCompareExchange128

如果运行使用在硬件的固有不支持 cmpxchg16b 命令的代码,结果是不可预知的。

此实例仅可用作内部。

示例

此示例使用 _InterlockedCompareExchange128 使用其所有单词的总和替换的高位字中。两个 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]);
}
  

特定于 Microsoft 的结尾

由 Advanced Micro 设备,公司所有权利版权所有 2007 中保留了。 重现经 Advanced Micro 设备授予,公司

请参见

参考

编译器内部函数

_InterlockedCompareExchange Intrinsic Functions

与 x86 编译器冲突