因為XP以下的環境不能使用
InterlockedExchange64 和 InterlockedExchangeAdd64,
只好自己複製這一段程式出來使用.
而不是直接呼叫系統API來使用.
LONGLONG __declspec( naked ) WINAPI myInterlockedCompareExchange64 (
__inout LONGLONG volatile *Destination,
__in LONGLONG Exchange,
__in LONGLONG Comperand) {
__asm {
push ebx
push ebp
mov ebp,dword ptr [esp+0Ch]
mov ebx,dword ptr [esp+10h]
mov ecx,dword ptr [esp+14h]
mov eax,dword ptr [esp+18h]
mov edx,dword ptr [esp+1Ch]
lock cmpxchg8b qword ptr [ebp]
pop ebp
pop ebx
ret 14h
}
}
LONGLONG
myInterlockedExchange64 (
__inout LONGLONG volatile *Target,
__in LONGLONG Value
)
{
LONGLONG Old;
do {
Old = *Target;
} while (myInterlockedCompareExchange64(Target,
Value,
Old) != Old);
return Old;
}
LONGLONG
myInterlockedExchangeAdd64(
__inout LONGLONG volatile *Addend,
__in LONGLONG Value
)
{
LONGLONG Old;
do {
Old = *Addend;
} while (myInterlockedCompareExchange64(Addend,
Old + Value,
Old) != Old);
return Old;
}