[英]Atomic Operations in C on Linux
我試圖將我從Mac OS X編寫的一些代碼移植到Linux上,並且很難找到適合OSX的替代OSAtomic.h
。 我找到了gcc __sync*
系列,但我不確定它是否與我的舊編譯器/內核兼容。 我需要在GCC v4.1.2和內核2.6.18上運行代碼。
我需要的具體操作是:
奇怪的是,在linux機器上運行locate stdatomic.h
找到頭文件(在c ++目錄中),而在我的OSX機器上運行相同的命令(gcc v4.6.3)則不會返回任何內容。 我需要安裝什么來獲取stdatomic庫,它是否適用於gcc v 4.1.2?
作為旁注,我不能使用任何第三方庫。
好吧,沒有什么可以阻止你在其他平台上使用OSAtomic
操作。 ARM,x86和PPC的OSAtomic
操作源是Apple的libc的一部分,它是opensource。 請確保您沒有使用OSSpinLock
,因為它特定於Mac OS X,但這可以很容易地被Linux futexes取代。
看到這些:
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
OpenPA項目在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);
它還包含細粒度的內存屏障(即讀取,寫入和讀取/寫入),而不僅僅是完整的內存屏障。
主頭文件有一個注釋,顯示庫中可用的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.