InterlockedCompareExchange函数
- 函数原型:
LONG64 InterlockedCompareExchange64(
[in, out] LONG64 volatile *Destination,
[in] LONG64 ExChange,
[in] LONG64 Comperand
);
- 函数说明:
函数将 Destination 值与 Compareand 值进行比较。如果 Destination 值等于 Compareand 值, 则 Exchange 值将存储在 Destination 指定的地址中。 否则,不会执行任何操作。返回值是 Destination 指针的初始值。
此函数的变量必须在 64 位边界上对齐;否则,此函数在多处理器 x86 系统和任何非 x86 系统上的行为将不可预知。
- 伪代码:
int InterlockedCompareExchange64(int Destination,int ExChange,int Comperand){
int tmp = Destination;
if(Destination== Comperand){
Destination= ExChange;
}else{
}
return tmp;
}
cmpxchg指令
这条指令将al\ax\eax\rax中的值与首操作数比较:
-
如果相等,第2操作数的直装载到首操作数,zf置1。
-
如果不等, 首操作数的值装载到al\ax\eax\rax,并将zf清0。
如上所述,假设将al/ax/eax/rax当作第三个参数,cmpxchg指令也可以写为如下格式伪码:
int cmpxchg(int p1,int p2,int p3){
if(p1 == p3){
p1 = p2;
zf = 1;
}else{
p3 = p1;
zf = 0;
}
return p3;
}
如果除去zf的影响,两个函数有部分代码功能相同,仅限于第一个和第三个操作数相等时。