La synchronisation avec `std :: mutex` est-elle plus lente qu’avec` std :: atomic (memory_order_seq_cst) `?

La principale raison de l’utilisation de l’atomique sur les mutex est que les mutex sont chers, mais que le modèle de mémoire par défaut pour atomics étant memory_order_seq_cst , n’est-ce pas aussi cher?

Question: Un programme simultané utilisant des verrous peut-il être aussi rapide qu’un programme sans verrou concurrent?

Si c’est le cas, cela ne vaut peut-être pas la peine, sauf si je veux utiliser memory_order_acq_rel pour atomics.


Edit: Il se peut que je manque quelque chose, mais le locking basé sur le locking ne peut pas être plus rapide que le locking automatique, car chaque locking devra également constituer une barrière de mémoire complète. Mais avec le locking sans clé, il est possible d’utiliser des techniques moins ressortingctives que les barrières de mémoire.

Revenons donc à ma question, est-ce que le locking libre est plus rapide que le locking basé sur le nouveau standard C ++ 11 avec memory_model ?

Est-ce que “sans locking> = basé sur le locking lorsque mesuré en performances” est vrai? Supposons 2 threads matériels.


Edit 2: Ma question ne concerne pas les garanties de progrès et peut-être que j’utilise un système “sans locking” hors contexte.

Fondamentalement, lorsque vous avez 2 threads avec mémoire partagée et que la seule garantie dont vous avez besoin est que si un thread écrit, l’autre thread ne peut ni lire ni écrire, mon hypothèse est qu’une simple opération atomique compare_and_swap serait beaucoup plus rapide que de verrouiller un mutex.

Parce que si un thread ne touche même jamais la mémoire partagée, vous finirez par verrouiller et déverrouiller sans raison, mais avec les opérations atomiques, vous n’utilisez qu’un cycle de traitement à la fois.

En ce qui concerne les commentaires, un verrou tournant vs un verrou mutex est très différent quand il y a très peu de conflit.

La programmation sans locking est une garantie de progrès : du plus fort au plus faible, il s’agit de temps d’ attente , de locking , d’ obstruction et de blocage .

Une garantie coûte cher et a un prix. Plus vous voulez de garanties, plus vous payez. En règle générale, un algorithme de blocage ou une structure de données (avec un mutex, par exemple) possède les libertés les plus grandes et est donc potentiellement la plus rapide. Un algorithme sans attente de l’autre extrême doit utiliser des opérations atomiques à chaque étape, ce qui peut être beaucoup plus lent.

Obtenir un verrou est en fait plutôt bon marché, vous ne devriez donc jamais vous en inquiéter sans une compréhension approfondie du sujet. De plus, les algorithmes de blocage avec mutex sont beaucoup plus faciles à lire, à écrire et à raisonner. En revanche, même les structures de données sans locking les plus simples résultent de recherches longues et ciblées, chacune d’elles valant un ou plusieurs doctorats.

En résumé, les algorithmes sans locking ou sans attente échangent le temps de latence le plus élevé contre le temps de latence moyen et le débit. Tout est plus lent, mais rien n’est jamais très lent. C’est une caractéristique très spéciale qui n’est utile que dans des situations très spécifiques (comme les systèmes en temps réel).

Un verrou a tendance à nécessiter plus d’opérations qu’une simple opération atomique. Dans les cas les plus simples, memory_order_seq_cst sera environ deux fois plus rapide que le locking, car celui-ci nécessite généralement au moins deux opérations atomiques (une pour verrouiller, une pour déverrouiller). Dans de nombreux cas, cela prend encore plus que cela. Cependant, une fois que vous commencez à exploiter les ordres de la mémoire, cela peut être beaucoup plus rapide car vous êtes prêt à accepter moins de synchronisation.

En outre, vous verrez souvent que “les algorithmes de locking sont toujours aussi rapides que les algorithmes sans locking”. C’est un peu vrai. L’idée de base est que si l’algorithme le plus rapide s’avère être sans locking, alors l’algorithme le plus rapide sans la garantie sans locking est AUSSI le même algorithme! Cependant, si l’algorithme le plus rapide nécessite des verrous, ceux qui exigent des garanties sans locking doivent trouver un algorithme plus lent.

En général, vous verrez les algorithmes lockfree dans quelques algorithmes de bas niveau, où la performance de l’exploitation d’opcodes spécialisés aide. Dans presque tous les autres codes, le locking est une performance plus que satisfaisante et beaucoup plus facile à lire.