Question

Je veux savoir si je tente de bits ensemble dans un char / entier de plusieurs threads, vais-je perdre toute modification? Je vais avoir tous les zéros au départ et les threads ne le mettre à 1. L'architecture du système est x64.

Merci, Gokul.

Était-ce utile?

La solution

Sur x64 (et x86) opérations sur ints sont atomiques. Cela signifie que les lectures et écritures sont indépendamment atomique, et non en combinaison. (Par ex Si vous avez deux fils écrire un int en même temps, vous ne verrez pas la moitié d'un jour et demi de l'autre -. Vous verrez toujours un int complet ou l'autre)

Cependant, la lecture et l'écriture sont deux opérations distinctes. Vous pouvez effectuer certaines opérations emboîtées (ce qui provoque la lecture et écriture à une seule opération atomique) mais je ne crois pas que la logique tombe dans l'bitwise ensemble d'opérations qui peuvent être effectuées de cette manière.

Je pense que vous devrez verrouiller sur certains mutex / moniteur et effectuer la lecture / écriture si vous voulez que cette opération soit atomique.

Autres conseils

Vous devez utiliser un mutex ou un mécanisme de synchronisation semblable, ou une opération atomique. Pour les premiers, il y a des bibliothèques et Windows POSIX facilement disponibles et très standard. Pour ce dernier, la plupart des compilateurs fourniront des fonctions (par exemple http://gcc.gnu.org/wiki/Atomic ), le mode assembleur en ligne ou tout autre moyen pratique de les utiliser, et vous pouvez toujours revenir à un lien vers un objet compilé à partir langage assembleur.

Vous pouvez certainement pas éviter une telle synchronisation explicite. Même si par exemple XOR en quelque sorte opéré directement et atomiquement sur la valeur dans vos cœurs de processeurs les plus intimes mémoire cache (ce qui ne fonctionne pas), vous devez garantir que la valeur est synchronisé avec les caches d'autres noyau CPU. Seules les instructions CPU qui caches explicitement synchronisation sont utiles pour vous - il est plus facile de les utiliser dans l'une des options bibliothèque mentionnées ci-dessus

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