2012-08-23 54 views
5

我想將我從Mac OS X寫入Linux的一些代碼移植到Linux上,並且正努力找到合適的OSX替代品OSAtomic.h。我發現gcc __sync*系列,但我不確定它會與我有的舊編譯器/內核兼容。我需要在GCC v4.1.2和2.6.18內核上運行代碼。Linux上的C原子操作

我需要具體操作是:

  • 增量
  • 遞減
  • 比較和交換

是什麼奇怪的是,在Linux機器上運行locate stdatomic.h找到頭文件(在C++目錄中),而在我的OSX機器上運行相同的命令(gcc v4.6.3)則什麼也不返回。我需要安裝什麼來獲取stdatomic庫,並且它可以與gcc v 4.1.2一起使用?

作爲一個方面說明,我不能使用任何第三方庫。

+1

GCC原子構建文檔記錄爲[4.1.1]的一部分(http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html)。 – jxh

+0

類似的增量和獲取和沒有GCC版本要求:http://stackoverflow.com/questions/2353371/atomic-increment-fetch –

回答

5

那麼,沒有什麼可以阻止您在其他平臺上使用OSAtomic操作。針對ARM,x86和PPC的OSAtomic操作的源代碼是Apple開放源代碼的libc的一部分。只要確保你沒有使用OSSpinLock,因爲它是特定於Mac OS X的,但這可以很容易地被Linux futex取代。

看到這些:

http://opensource.apple.com/source/Libc/Libc-594.1.4/i386/sys/OSAtomic.s http://opensource.apple.com/source/Libc/Libc-594.1.4/ppc/sys/OSAtomic.s http://opensource.apple.com/source/Libc/Libc-594.1.4/arm/sys/OSAtomic.s

或者,你可以使用sync_*家庭,我相信在大多數平臺上,我相信在這裏描述應該工作:http://gcc.gnu.org/wiki/Atomic

5

OpenPA project提供了MIT風格許可證下的便攜式原子操作庫。這是我之前使用過的,非常簡單。您操作的代碼看起來像

#include "opa_primitives.h" 

OPA_int_t my_atomic_int = OPA_INT_T_INITIALIZER(0); 

/* increment */ 
OPA_incr_int(&my_atomic_int); 

/* decrement */ 
OPA_decr_int(&my_atomic_int); 

/* compare and swap */ 
old = OPA_cas_int(&my_atomic_int, expected, new); 

它還包含細粒度內存障礙(即讀,寫和讀/寫),而不是僅僅一個完整的內存柵欄。

main header file有一個註釋,顯示庫中可用的操作。

4

自GCC 4.0.1以來,GCC原​​子內在函數已經可用。

有沒有什麼能阻止你建立GCC 4.7或鏗鏘與GCC 4.1.2,然後獲得所有的新功能,如C11 atomics

有很多地方可以找到BSD許可的原子的彙編程序實現作爲最後的手段。