2012-11-07 34 views
2

我正在寫操作系統無關的無鎖隊列,隊列工作正常(與默認的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 

我知道我還有CMPXCHG之前添加lock,它應該與結構工作,但現在我更感興趣的是它的工作。

我編譯使用NASM,05年2月10日使用此命令nasm.exe -f elf -o cas.o cas.asm ,我得到這個錯誤testas\cas.asm:14: error: invalid combination of opcode and operands

+0

此方法限制您使用x86平臺。 –

回答

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 

這些都支持以下接口:

/* 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); 

MSDN documentationGCC documentation。這也應該對Clang起作用而不做任何修改,因爲Clang宣稱__GNUC__與其預定義的宏兼容。

+0

+1我印象深刻 –

+0

這可能會做到這一點,Mac OS如何?它需要額外的#ifdef嗎? –

+0

@Full_Int:它可以在OS X上運行。確保你沒有在OS X上使用GCC 4.0。 –