2009-07-15 8 views
26

Existe-t-il une méthode portative (POSIX-) en C pour les opérations sur les variables atomiques, similaire à un threading portable avec pthread?Opérations atomiques portatives UNIX

Les opérations atomiques sont des opérations telles que "increment and get" qui sont exécutées de manière atomique, ce qui signifie qu'aucun commutateur de contexte ne peut interférer avec l'opération. Dans l'espace noyau Linux, nous avons le type atomic_t, en Java nous avons le paquet java.util.concurrent.atomic.

Sous Linux, le fichier atomic.h fournit des opérations atomiques, mais l'inclusion dépend de la plate-forme, par ex. #include <asm-x86_64/atomic.h> et il n'est pas disponible sur Mac OS X de la même manière.

+0

Il y a quelques GCC Encastrements, [décrit ici] (http://gcc.gnu.org/onlinedocs/gcc-4.5.0/ gcc/Atomic-Builtins.html). – caf

+0

Nice, limité à GCC, mais ce serait bien pour moi. – dmeister

+0

et ici pour plus récent gcc: http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html – osgx

Répondre

0

AFAIK il n'y a pas de façons multiplateformes de faire des opérations atomiques. Il peut y avoir une bibliothèque là-bas mais je ne sais pas. Ce n'est pas particulièrement difficile de rouler le vôtre, cependant.

0

Je ne pense pas qu'il y en ait. Une manière de le résoudre, bien que les licences le permettent bien sûr, serait de copier les implémentations per-architectures pertinentes à partir de, par exemple, l'espace du noyau Linux. Je n'ai pas suivi de près l'évolution de ces primitives, mais je suppose qu'elles sont en fait des primitives, c'est-à-dire qu'elles ne dépendent pas d'autres services ou API dans le noyau.

3

Non, POSIX ne spécifie pas aucune opération portable sans verrou/atomique. C'est pourquoi ils ont des pthreads.

Vous allez devoir utiliser des méthodes non standard ou vous en tenir aux ptrheads pour la portabilité.

9

Depuis que vous avez demandé OS X:

(et depuis que la Croix platformity a été soulevée dans ce fil.)

OS X a des fonctions OSAtomicAdd32() et amis. Ils sont déclarés dans "/usr/include/libkern/OSAtomic.h". Voir The Threading Programming guide, section "Utilisation des opérations atomiques". Et pour Windows, il y a InterlockedIncrement() et les amis (voir MSDN).

Ensemble avec le builtins gcc __sync_fetch_and_add() et les amis (a été lié ci-dessus), vous devriez avoir quelque chose pour chaque plate-forme principale de bureau.

S'il vous plaît noter que je ne les ai pas encore utilisés par moi-même, mais peut-être le fera dans les prochains jours.

12

Pour ceux qui trébucheront à ce sujet dans le futur, les atomiques C11 sont la meilleure façon de le faire maintenant - je crois qu'ils seront inclus dans GCC 4.9.

+8

Pouvez-vous développer là-dessus? – GraphicsMuncher

6

A partir de C11, il existe un Atomic library optionnel qui fournit des opérations atomiques. Ceci est portable sur n'importe quelle plate-forme qui a un compilateur C11 (comme gcc-4.9) avec cette fonctionnalité optionnelle.

La présence de l'atome peut être vérifiée par __STDC_NO_ATOMICS__ et la présence de <stdatomic.h>

atomique.c

#include <stdio.h> 
#include <stdlib.h> 
#ifndef __STDC_NO_ATOMICS__ 
#include <stdatomic.h> 
#endif 

int main(int argc, char**argv) { 
    _Atomic int a; 
    atomic_init(&a, 42); 
    atomic_store(&a, 5); 
    int b = atomic_load(&a); 
    printf("b = %i\n", b); 

    return EXIT_SUCCESS; 
} 

invocations compilateur

clang -std=c11 atomic.c 
gcc -std=c11 atomic.c