Ful*_*Int 2 c linux windows assembly atomic
我正在编写独立于操作系统的无锁队列,队列工作正常(使用默认的windows\linux原子CAS),但我想让队列工作,而不需要在linux和windows中进行任何更改.所以我猜我应该在汇编程序中编写自己的CAS,还是有其他方法可以实现?
到目前为止,我有这个代码:
global _CAS
_CAS:
mov eax, [esp+4]
mov edx, [esp+8]
mov ecx, [esp+12]
;XCHG eax, edx <- this function works fine
CMPXCHG ecx, eax, ebx
ret
Run Code Online (Sandbox Code Playgroud)
我知道我lock
之前仍然需要添加CMPXCHG
,它应该与结构一起使用,但是现在我对使它工作更感兴趣.
我用这个命令使用nasm-2.10.05进行编译nasm.exe -f elf -o cas.o cas.asm
,我得到了这个错误testas\cas.asm:14: error: invalid combination of opcode and operands
Die*_*Epp 12
你可以在两个平台上使用内在函数来完成它,不需要汇编:
#ifdef _MSC_VER
# include <intrin.h>
# define CAS(ptr, oldval, newval) \
_InterlockedCompareExchange(ptr, newval, oldval)
#elif __GNUC__
# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 1)
# error "requires GCC 4.1 or greater"
# endif
# define CAS(ptr, oldval, newval) \
__sync_val_compare_and_swap(ptr, oldval, newval)
#else
# error "CAS not supported on this platform"
#endif
Run Code Online (Sandbox Code Playgroud)
这两个都支持以下接口:
/* If the current value of *ptr is oldval, then write newval
into *ptr. Returns the initial value of *ptr. */
long CAS(long *ptr, long oldval, long newval);
Run Code Online (Sandbox Code Playgroud)
请参阅MSDN文档,GCC文档.这也应该对Clang起作用而不做任何修改,因为Clang宣传__GNUC__
了与其预定义宏的兼容性.
根据http://web.itu.edu.tr/kesgin/mul06/intel/instr/cmpxchg.html,cmpxchg
需要两个而不是三个参数。
也许,http://git.kernel.org/?p = linux/ kernel/git/torvalds/linux.git;a = blob; f = arch/ x86/include/asm/cmpxchg.h 也很有趣。