2012-08-23 15 views
5

Sto provando a portare un codice che ho scritto da Mac OS X a Linux e sto cercando di trovare un sostituto adatto solo per OSX OSAtomic.h. Ho trovato la famiglia gcc __sync*, ma non sono sicuro che sarà compatibile con il compilatore/kernel più vecchio che ho. Ho bisogno che il codice funzioni su GCC v4.1.2 e kernel 2.6.18.Operazioni atomiche in C su Linux

Le operazioni particolari di cui ho bisogno sono:

  • Incremento
  • Decremento
  • Confronta e Swap

Ciò che è strano è che in esecuzione locate stdatomic.h sulla macchina Linux trova il file di intestazione (in una directory C++), mentre l'esecuzione dello stesso comando sulla mia macchina OSX (gcc v4.6.3) non restituisce nulla. Cosa devo installare per ottenere la libreria stdatomic e funzionerà con gcc v 4.1.2?

Come nota a margine, non posso utilizzare alcuna libreria di terze parti.

+1

I buildin atomici di GCC sono documentati come parte di [4.1.1] (http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html). – jxh

+0

Simile per incremento e recupero e nessun requisito di versione GCC: http://stackoverflow.com/questions/2353371/atomic-increment-fetch –

risposta

5

Bene, non c'è niente che ti impedisca di utilizzare le operazioni OSAtomic su altre piattaforme. Le fonti per le operazioni OSAtomic per ARM, x86 e PPC fanno parte della libc di Apple che è opensource. Assicurati di non utilizzare OSSpinLock come è specifico per Mac OS X, ma può essere facilmente sostituito dai futures Linux.

vedere questi:

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

In alternativa, è possibile utilizzare la famiglia sync_*, che a mio avviso dovrebbe funzionare sulla maggior parte delle piattaforme, che credo sono descritti qui: http://gcc.gnu.org/wiki/Atomic

5

Lo OpenPA project fornisce una libreria portatile di operazioni atomiche con una licenza in stile MIT. Questo è uno che ho usato prima ed è piuttosto semplice. Il codice per le operazioni sarebbe simile

#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); 

Esso contiene anche le barriere di memoria a grana fine (cioè leggere, scrivere e lettura/scrittura) invece di una recinzione di memoria piena.

Lo main header file ha un commento che mostra le operazioni disponibili nella libreria.

4

GCC atomici sono disponibili da GCC 4.0.1.

Non c'è nulla che ti impedisce di costruire GCC 4.7 o Clang con GCC 4.1.2 e quindi ottenere tutte le nuove funzionalità come C11 atomics.

Ci sono molte posizioni in cui è possibile trovare implementazioni di atomizzatori con licenza BSD come ultima risorsa.

Problemi correlati