InterlockedCompareExchange128用法

时间:2012-07-18 17:45:16

标签: c++ multithreading visual-c++

我正在尝试使用MS VC ++ Intrinsic InterlockedCompareExchange128函数。

作为一个问候世界,我试图将16字节地址与自身进行比较,并用其他东西替换它。这编译,但它不起作用 - 地址不与新值交换。 const_cast用于使其编译(否则它会因无法转换volatile而哭泣)。

typedef struct t_node
{
    volatile __int64 arr[2];
}node;

int main()
{   

    node *a = new node();

    a->arr[0] = 100;
    a->arr[1] = 1;

    __int64 i = 200;
    __int64 j = 500;

    char r = _InterlockedCompareExchange128(a->arr, i,j, const_cast<__int64*>(&a->arr[0]));

    cout<<endl<<"Interlocked Compare Res: "<<r;

    cin.get();
    return 0;
}

1 个答案:

答案 0 :(得分:4)

来自documentation

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

[in,out] ComparandResult
  指向两个64位整数(被视为128位字段)的数组的指针,以与目标进行比较。 在输出时,会被目的地的原始值覆盖。

因此,会发生什么是伪代码:

if(ComparandResult != Destination)
{
    temp = Destination
    Destination = ExchangeHigh:ExchangeLow
    ComparandResult = temp
}

Destination == ComparandResult(您的情况)是:

时会发生什么
if(ComparandResult != Destination)
{
    temp = Destination
    Destination = ExchangeHigh:ExchangeLow
    Destination = temp
}

哪个是nop 此外,在同一页面中还有一个注释:

  

请注意
  ComparandResult的值始终被覆盖。之后   锁定指令,此内在函数立即复制初始值   ComparandResult的目的地。出于这个原因,ComparandResult   和Destination应指向单独的内存位置以避免   出乎意料的行为。