在32位Visual Studio C ++中可以使用以下代码。是否有使用内在函数的64位等效项,因为64位版本的Visual Studio C ++不支持内联ASM?
FORCEINLINE bool bAtomicCAS8(volatile UINT8 *dest, UINT8 oldval, UINT8 newval)
{
bool result=false;
__asm
{
mov al,oldval
mov edx,dest
mov cl,newval
lock cmpxchg byte ptr [edx],cl
setz result
}
return(result);
}
以下instrinsics在Visual Studio C ++下编译
_InterlockedCompareExchange16
_InterlockedCompareExchange
_InterlockedCompareExchange64
_InterlockedCompareExchange128
我正在寻找的东西是
_InterlockedCompareExchange8
但这似乎并不存在。
答案 0 :(得分:3)
不,那不存在。如果需要,您可以在线外实现它。
atomic_msvc_x64.asm
_text SEGMENT
; char _InterlockedCompareExchange8(volatile char*, char NewValue, char Expected)
; - RCX, RDX, R8
_InterlockedCompareExchange8 PROC
mov eax,r8d
lock cmpxchg [rcx],dl
ret
_InterlockedCompareExchange8 ENDP
_text ENDS
END
答案 1 :(得分:3)
验证了Visual Studio 2012,这种内在存在:
char _InterlockedCompareExchange8(volatile char*, char NewValue, char Expected)
但是,文档中似乎没有任何内容。