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?

Était-ce utile?

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.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top