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

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

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;
}

最佳答案

documentation

unsigned char _InterlockedCompareExchange128(
   __int64 volatile * Destination,
   __int64 ExchangeHigh,
   __int64 ExchangeLow,
   __int64 * 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
}


这是个小事。
另外,在同一页面中有一条注释:


  注意
  ComparandResult的值始终被覆盖。之后
  锁定指令,此内在函数立即复制初始值
  比较结果的目标。因此,比较结果
  和目的地应指向单独的内存位置,以避免
  意外行为。

10-06 05:29