2011-11-03 5 views
2

Jusqu'à ce que std::atomic est disponible, quelle est la multiplateforme (Windows & linux) façon d'incrémenter de manière atomique une variable?incrément atomique multiplateforme

Je suis actuellement utiliser boost::detail::atomic_count mais c'est dans l'espace de noms boost::detail et je ne sais pas si c'est sûr à utiliser.

+1

Avez-vous regardé l'actuellement sous-évaluation [Boost.Atomic] (http://www.chaoticmind.net/~ hcb/projects/boost.atomic/doc/index.html) bibliothèque? – ildjarn

+1

'std :: atomic' est déjà disponible. Non? –

+0

MSVC et GCC ont tous deux le support std :: atomic maintenant. Il y a aussi http://www.stdthread.co.uk – Eloff

Répondre

2

Un multiplateforme, mais le compilateur de façon spécifique est d'utiliser GCC __sync_fetch_and_add.

Ou définir vous-même une telle fonction avec un peu de compilation conditionnelle:

#ifdef __GNUC__ 
#define atomic_inc(ptr) __sync_fetch_and_add ((ptr), 1) 
#elif defined (_WIN32) 
#define atomic_inc(ptr) InterlockedIncrement ((ptr)) 
#else 
#error "Need some more porting work here" 
#endif 
+4

__sync_fetch_and_add et MSVC InterlockedIncrement ne sont pas équivalents dans leurs types de retour. __sync_fetch_and_add renvoie la valeur * previous * de ptr et InterlockedIncrement renvoie la valeur résultante de ptr incrémentée. Ce que vous devez utiliser est "__sync_add_and_fetch" pour être équivalent/interchangeable. –

+0

En outre, 'InterlockedIncrement' est uniquement pour les valeurs 32 bits. – rubenvb