82 votes

c++ std::atomique, qu'est-ce que std::memory_order et comment les utiliser?

Quelqu'un peut-il expliquer ce qu'est std::memory_order en clair, et comment les utiliser avec std::atomic<>?

J'ai trouvé la référence et quelques exemples ici, mais ne comprends pas du tout. http://en.cppreference.com/w/cpp/atomic/memory_order

Merci.

50voto

Anthony Williams Points 28904

L' std::memory_order valeurs vous permettent de spécifier fine des contraintes sur la mémoire de commande fourni par votre des opérations atomiques. Si vous êtes à la modification et l'accès atomique variables à partir de plusieurs threads, puis passer le std::memory_order valeurs de vos opérations vous permettent de relaxer les contraintes sur le compilateur et le processeur sur l'ordre dans lequel les opérations sur ces atomique variables deviennent visibles pour les autres threads, et la synchronisation des effets de ces opérations sur la non-atomique de données dans votre application.

L'ordre par défaut de std::memory_order_seq_cst est le plus contraint, et fournit la "intuitive" propriétés que vous pouvez attendre: si Un thread stocke certaines données et définit ensuite atomique indicateur à l'aide de std::memory_order_seq_cst, alors si thread B voit le drapeau est réglé, alors il peut voir que les données écrites par filetage A. L'autre de la mémoire de commande les valeurs ne sont pas nécessairement fournir cette garantie, et doivent donc être utilisés avec beaucoup de prudence.

Le principe de base est: ne pas utiliser autre chose que de l' std::memory_order_seq_cst (valeur par défaut), sauf si (a) vous avez vraiment vraiment savoir ce que vous faites, et peut prouver que l'ambiance détendue de l'utilisation est sûre dans tous les cas, et (b) votre profiler montre que la structure des données et les opérations que vous avez l'intention d'utiliser de l'ambiance détendue de rangements sont un goulot d'étranglement.

Mon livre, C++ Simultanéité dans l'Action consacre un chapitre entier (45 pages) pour les détails du C++ modèle de mémoire, les opérations atomiques et l' std::memory_order contraintes, et un autre chapitre (44 pages) à l'aide d'opérations atomiques pour la synchronisation sans verrouillage des structures de données, et les conséquences de la relâche de la commande de contraintes.

Mon blog sur l'algorithme de Dekker et de l'algorithme de Peterson pour l'exclusion mutuelle de démontrer certaines de ces questions.

28voto

je4d Points 4591

Quelqu'un peut-il expliquer ce qu'est std::memory_order en anglais,

Le meilleur "Plain English" explication que j'ai trouvé pour la mémoire différents ordonnancements est Bartoz Milewski de l'article sur la décontraction des atomics: http://bartoszmilewski.com/2008/12/01/c-atomics-and-memory-ordering/

Et le suivi post: http://bartoszmilewski.com/2008/12/23/the-inscrutable-c-memory-model/

Mais notez que, bien que ces articles sont une bonne introduction, ils datent d'avant le C++11 standard et ne sera pas vous dire tout ce que vous devez savoir pour utiliser de façon sécuritaire.

et comment les utiliser avec std::atomic<>?

Mon meilleur conseil pour vous est la suivante: ne pas. Détendu atomics sont (probablement) la plus délicate et la plus dangereuse chose en C++11. Bâton d' std::atomic<T> avec la valeur par défaut de la mémoire de commande (séquentiel de la cohérence) jusqu'à ce que vous êtes vraiment, vraiment sûr que vous avez un problème de performance qui peuvent être résolus à l'aide de l'atmosphère détendue de la mémoire rangements.

Dans le deuxième article lié ci-dessus, Bartoz Milewski parvient à la conclusion suivante:

Je n'avais aucune idée de ce qui m'attendait lors de la tentative de raison le C++ faible atomics. La théorie derrière eux est si complexe qu'il est la limite de l'inutilisable. Il a fallu trois personnes (Anthony, Hans et moi) et une modification de la Norme pour terminer la preuve d'une assez algorithme simple. Imaginer faire la même chose pour un lock-free file d'attente en fonction sur la faiblesse des atomics!

18voto

zvrba Points 14028

Pas de. Un "plain english" explication prend de 32 pages et peut être trouvé ici.

Si vous ne voulez pas lire, vous pouvez oublier la mémoire de la commande parce que la page que vous avez lié à dit que la valeur par défaut est de façon séquentielle-conforme de la commande, qui est "toujours faire la sane chose"-réglage.

À utiliser avec tout autre paramètre, vous vraiment devez lire et comprendre le document cité ci-dessus, et les exemples en elle.

5voto

edA-qa mort-ora-y Points 8413

En bref, votre compilateur et le PROCESSEUR peut exécuter des instructions en vue différent de la façon dont vous les avez écrites. Pour un seul thread, ce n'est pas un problème tel qu'il s'affiche correctement. Pour plusieurs threads sur les processeurs multiples, cela devient un problème. La mémoire de commande en C++ limite de ce que votre compilateur/CPU peut faire et résout ces problèmes.

Par exemple, si vous regardez mon article sur la double-vérifier le verrouillage , vous pouvez voir comment la commande de dégâts avec ce modèle -- il mentionner montrer atomique de la mémoire de commande peut être utilisé pour le fixer.

À propos de la réorganisation de lui-même, vous pouvez également envisager de CPU Réorganisation -- encore une fois, le compilateur peut également faire réorganise ainsi.

Sachez que tous les documents sur ce sujet (dont le mien) offrent parler de scénarios théoriques. Le plus commun des Processeurs, comme x86, ont de très fortes garanties d'organisation telles que beaucoup explicite de la commande n'est tout simplement pas nécessaire. Ainsi, même si vous n'utilisez pas le bon C++11 atomics votre code sera probablement encore en travaux.

Comme zvrba mentionné, le sujet est en fait assez détaillée. Le noyau linux doc sur les barrières de la mémoire contient aussi beaucoup d'informations détaillées.

3voto

plan9assembler Points 2209

Il y a quelques plaine de l'anglais dans GCC wiki. ;)

http://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X