Je suis dans une situation où j'ai besoin de la somme atomique de deux valeurs en mémoire. Le code I hérité va comme ceci:Y at-il un moyen que je puisse faire deux lectures atomiques?
int a = *MemoryLocationOne;
memory_fence();
int b = *MemoryLocationTwo;
return (a + b) == 0;
L'individu lit a et b sont atomiques, et toutes les écritures ailleurs dans le code à ces deux emplacements de mémoire sont également Lockless atomique. Cependant, le problème est que les valeurs des deux emplacements peuvent changer et changent entre les deux lectures.
Alors, comment rendre cette opération atomique? Je sais tout à propos de CAS, mais il a tendance à impliquer seulement des opérations de lecture-modification-écriture atomique et ce n'est pas tout à fait ce que je veux faire ici.
Y at-il un moyen de le faire, ou est la meilleure option pour refactoriser le code de sorte que j'ai seulement besoin de vérifier une valeur? Edit: Merci, je n'ai pas mentionné que je voulais faire ceci sans clé dans la première révision, mais certaines personnes l'ont repris après ma seconde révision. Je sais que personne ne croit les gens quand ils disent des choses comme ça, mais je ne peux pas utiliser les verrous pratiquement. Je devrais imiter un mutex avec atomics et ce serait plus de travail que de refactoriser le code pour garder une trace au lieu de deux. Pour l'instant, ma méthode d'investigation consiste à tirer parti du fait que les valeurs sont consécutives et à les saisir atomiquement avec une lecture de 64 bits, dont je suis sûr qu'elles sont atomiques sur mes plates-formes cibles. Si quelqu'un a de nouvelles idées, s'il vous plaît contribuer! Merci.
Ils se trouvent des adresses consécutives de 32 bits et les processeurs dont j'ai besoin de coder pour travailler ont atomique 64 bits lectures si elles sont correctement alignées, donc Cela ressemble à la voie à suivre. –
Ah, dans ce cas, vous pouvez écrire un assemblage ou simplement vérifier la sortie de l'assemblage de votre compilateur pour vérifier que l'utilisation d'un type 64 bits fera l'affaire. Dans ce cas, vous pouvez aller sans verrou. – Eddie