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.