C ++ sont des opérations int atomique sur l'architecture MIPS
-
22-08-2019 - |
Question
Je me demande si je pouvais lire ou écrire une valeur partagée int sans verrouillage sur cpu MIPS (notamment Amazon ou Danube). Ce que je veux dire est que si une telle lecture ou d'écriture sont atomiques (autre thread ne peut pas les interrompre). Pour être clair -. Je ne veux pas empêcher la course entre les fils, mais je me soucie si la valeur int lui-même est pas corrompu
En supposant que le compilateur aligne tous les ints aux limites de mot cpu, il devrait être possible. J'utilise gcc (g ++). Tests montre également qu'il semble fonctionner correctement. Mais peut-être quelqu'un, il sait vraiment?
La solution
Utiliser des opérations atomiques BUILTIN de gcc et vous obtiendrez des avertissements s'ils ne sont pas pris en charge: http://gcc.gnu.org/onlinedocs/ gcc-4.1.2 / gcc / atomique-Builtins.html
Il ressemble à des combinaisons d'addition / soustraction et de test (au moins) sont possibles sur le matériel: http://rswiki.csie.org/lxr/ http / source / include / asm-mips / atomic.h
Autres conseils
Cela dépend de l'opération. Après avoir regardé des programmes assez démontées dans MIPS, je sais que seulement certaines opérations sont atomiques.
attribution d'une nouvelle valeur pourrait être 1 op ou plus, vous auriez à regarder l'ensemble.
par exemple:
x = 0; // move $a0, $0
x = 0x50000; // lui $a0, 0x0005
x = 0x50234; // lui $a0, 0x0005
// ori $a0, 0x0234
ou ici
voir ici voir danube et amazon sont MIPS32, que mon exemple couvre, et donc pas tout entier 32bit immédiat peut être écrit atomiquement.
voir R10000 dans l'affichage ci-dessus est MIPS64. Étant donné qu'une valeur de 32 bits serait la moitié de la taille du registre, il pourrait être une charge atomique / écriture.
Quelles opérations? Il est plausible que int a; a=42;
est atomique. Il n'y a aucune garantie que a= a+42;
est atomique, ou dans toutes les variantes comme avec ++
. , Vous devez également se préoccuper de ce que l'optimiseur peut faire, dire en maintenant une valeur intermédiaire dans un registre au moment opportun.
La question invite les réponses trompeuses.
Vous ne pouvez répondre péremptoirement « est-il des questions atomiques » sur le montage / langage machine.
Tout fragment de code C / C ++ donné ne donne aucune garantie, peut varier en fonction exactement compilateur (et version) que vous utilisez, etc. (sauf si vous appelez une intrinsèque spécifique à la plateforme ou tout le reste qui est garanti pour compiler à un atomique connu instruction machine.)