69,371
社区成员
发帖
与我相关
我的任务
分享
//InterlockedCompareExchange是windows 的一原子操作API
9000: unsigned __int64
9001: InterlockedCompareExchange(
9002: _Inout_ _Interlocked_operand_ unsigned __int64 volatile *Destination,
9003: _In_ unsigned __int64 Exchange,
9004: _In_ unsigned __int64 Comperand
9005: )
9006: {
001713C0 55 push ebp
001713C1 8B EC mov ebp,esp
001713C3 81 EC C0 00 00 00 sub esp,0C0h
001713C9 53 push ebx
001713CA 56 push esi
001713CB 57 push edi
001713CC 8D BD 40 FF FF FF lea edi,[ebp-0C0h]
001713D2 B9 30 00 00 00 mov ecx,30h
001713D7 B8 CC CC CC CC mov eax,0CCCCCCCCh
001713DC F3 AB rep stos dword ptr es:[edi]
9007: return (unsigned __int64) _InterlockedCompareExchange64((volatile long long*) Destination, (long long) Exchange, (long long) Comperand);
001713DE 8B 45 14 mov eax,dword ptr [Comperand]
001713E1 8B 55 18 mov edx,dword ptr [ebp+18h]
001713E4 8B 75 08 mov esi,dword ptr [Destination]
001713E7 8B 4D 10 mov ecx,dword ptr [ebp+10h]
001713EA 8B 5D 0C mov ebx,dword ptr [Exchange]
001713ED F0 0F C7 0E lock cmpxchg8b qword ptr [esi] //cmpxchg8b就是由CPU提供的指令
9008: }
这依赖处理器的原子操作指令,比如x86/x64中的lock cmpxchg/cmpxchg8b/cmpxchg16b,可以实现读、比较、修改的原子化,此一系列操作中间不会被中断,而且此时内存总线被锁定,其他处理器/核心不能访问内存/cache。
由硬件来/CPU保证 根据此理论,业界在原子操作的基础上提出了著名的 CAS(Compare - And - Swap)操作来实现 Lock-Free 算法,Intel 实现了一条类似该操作的指令:cmpxchg8。
这依赖处理器的原子操作指令,比如x86/x64中的lock cmpxchg/cmpxchg8b/cmpxchg16b,可以实现读、比较、修改的原子化,此一系列操作中间不会被中断,而且此时内存总线被锁定,其他处理器/核心不能访问内存/cache。
根据此理论,业界在原子操作的基础上提出了著名的 CAS(Compare - And - Swap)操作来实现 Lock-Free 算法,Intel 实现了一条类似该操作的指令:cmpxchg8。