En C, est i+=1;
atomique?
Réponses
Trop de publicités?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.
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.