30 votes

En C est "i + = 1;" atomique?

En C, est i+=1; atomique?

88voto

Steve Jessop Points 166970

La norme C ne définit pas si elle est atomique ou non.

En pratique, vous n'écrivez jamais de code qui échoue si une opération donnée est atomique, mais vous pourriez bien écrire du code qui échoue si ce n'est pas le cas . Supposez donc que ce n'est pas le cas.

18voto

DevSolar Points 18897

Non.

La seule opération garantie par le standard du langage C comme atomique consiste à affecter ou à récupérer une valeur vers / depuis une variable de type sig_atomic_t , définie dans <signal.h> .

(C99, chapitre 7.14 Traitement du signal.)

9voto

DigitalRoss Points 80400

Défini en C, pas de. Dans la pratique, peut-être. Écrire dans l'assemblée.

Le standard n'offrent aucune garantie.

Par conséquent, un programme portable ne serait pas faire de l'assomption. Il n'est pas clair si vous voulez dire "doivent être atomiques", ou "se trouve être atomique dans mon code C", et la réponse à cette deuxième question, c'est que cela dépend de beaucoup de choses:

  • Pas toutes les machines ont même une augmentation de la mémoire, op. Certains ont besoin de charger et de stocker la valeur dans le but d'opérer sur elle, de sorte que la réponse est "jamais".

  • Sur les machines qui n'ont pas d'incrémentation de la mémoire de l'op, il n'y a aucune assurance que le compilateur ne sera pas sortie d'une charge, d'incrémentation et de stocker la séquence de toute façon, ou d'utiliser certains autres non-atomique de l'instruction.

  • Sur les machines qui n'ont pas d'incrémentation de fonctionnement de la mémoire, il peut ou peut ne pas être atomique à l'égard des autres processeurs.

  • Sur les machines qui n'ont atomique de l'incrément de la mémoire de l'op, il ne peut pas être spécifié comme une partie de l'architecture, mais juste d'un bien d'une édition particulière de la puce du PROCESSEUR, ou même juste de certains de la logique de base ou de modèle de carte mère.

Quant à "comment puis-je faire cela de manière atomique", il est généralement un moyen de le faire rapidement, plutôt que de recourir à des (plus cher), négocié d'exclusion mutuelle. Parfois, cela implique de spécial collision de détection de reproductibles séquences de code. Il est préférable de les implanter dans un langage d'assemblage du module, parce que c'est spécifique à la cible de toute façon, donc il n'y a pas de portabilité des prestations pour les HLL.

Enfin, parce que les opérations atomiques qui ne nécessitent pas (cher), négocié exclusion mutuelle sont rapides et donc utile, et en tout cas nécessaire pour code portable, les systèmes ont généralement une bibliothèque, généralement écrit en assembleur, qui implémente déjà des fonctions similaires.

4voto

Andy Johnson Points 4683

Si l'expression est atomique ou non ne dépend que de la machine code que le compilateur génère, et le CPU architectre qu'il s'exécute. À moins que l'addition peut être réalisé en une seule instruction machine, son peu de chances d'être atomique.

Si vous utilisez Windows, vous pouvez utiliser l' InterlockedIncrement() la fonction de l'API de faire une garantie atomique de l'incrément. Il y a des fonctions similaires pour décrémenter, etc.

2voto

Dan Cristoloveanu Points 1321

Cela dépend vraiment de votre cible et de l'ensemble mnémonique de votre uC / processeur. Si i est une variable conservée dans un registre, il est possible de l'avoir atomique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X