我正在尝试使用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;
}
答案 0 :(得分:4)
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应指向单独的内存位置以避免 出乎意料的行为。