簡體   English   中英

Linux上的C中的原子操作

[英]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);

它還包含細粒度的內存屏障(即讀取,寫入和讀取/寫入),而不僅僅是完整的內存屏障。

主頭文件有一個注釋,顯示庫中可用的操作。

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

沒有什么能阻止您使用GCC 4.1.2構建GCC 4.7或Clang,然后獲得所有較新的功能,如C11原子

有許多地方你可以找到原子能的BSD許可匯編程序實現作為最后的手段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM