2015-10-08 1 views
1

J'ai commencé à travailler pour apprendre la programmation multicœur. J'ai commencé à pencher C++ 11 atomics. Je voudrais savoir si toutes les variables partagées doivent être atomiques?Toutes les variables partagées doivent-elles être atomiques?

+0

Non, pas tous. Il existe également d'autres méthodes pour maintenir la cohérence séquentielle (la plus évidente est celle des verrous). La question elle-même montre que vous n'avez aucune idée de ce que vous demandez. Pour résoudre ce problème, cochez [Le guide et la liste du livre C++ définitif] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) et plus précisément [Concurrence C++ en action par Anthony Williams] (http://rads.stackoverflow.com/amzn/click/1933988770). Faites d'autres recherches sur le sujet avant de demander quoi que ce soit d'autre. – Drop

Répondre

0

Si plusieurs threads accèdent (lecture/écriture) à la même variable, alors il doit être atomique. Aussi, vous pouvez aller à this.

+0

Si plusieurs threads lisent la même variable, il est inutile de la rendre atomique. – Drop

+0

@Drop si seule la lecture peut alors pas nécessaire mais dans le cas de lecture/écriture, il est nécessaire ce que j'ai appris de ce http://stackoverflow.com/questions/31555700/do-i-really-need-mutex-lock-in -ce cas – Mohan

0

La seule fois où une variable doit être « atomique », -à-dire, peut être mis à jour dans « un seul coup, sans autre fil étant capable de lire entre-temps », est si elle même peut lire pendant que quelqu'un d'autre le met à jour. Par exemple, s'il est défini à l'initialisation et ne change jamais, personne ne peut jamais le lire pendant qu'il change, et donc il ne doit pas nécessairement être atomique. D'autre part, si elle ne change jamais après l'initialisation et il y a un risque que quelqu'un d'autre que le fil changeant le lit en il change, il doit être atomique (intrinsics atomiques ou protégés par mutex ou autrement)

0

Pas nécessairement pour tous les scénarios. Notez également que l'atomicité de l'accès variable seul ne garantit pas la sécurité complète du thread. Il s'assure simplement que la variable particulière lue est dans son ensemble. Dans certaines architectures, l'opération de lecture ne se produit pas dans une seule instruction d'assemblage. Par exemple, si vous lisez une valeur de 64 bits, le compilateur peut implémenter la lecture en utilisant deux instructions d'assemblage de chargement, de sorte que la première instruction lit les 32 bits inférieurs et la seconde instruction lit les 32 bits supérieurs. Cela peut à son tour conduire à des conditions de course. Donc, les lectures atomiques sont préférées.