我正在尝试使用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;
}
最佳答案
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的值始终被覆盖。之后
锁定指令,此内在函数立即复制初始值
比较结果的目标。因此,比较结果
和目的地应指向单独的内存位置,以避免
意外行为。