Maison >développement back-end >C++ >Pourquoi définir l'indicateur d'arrêt en utilisant memory_order_seq_cst, si vous le vérifiez avec memory_order_relaxed ?

Pourquoi définir l'indicateur d'arrêt en utilisant memory_order_seq_cst, si vous le vérifiez avec memory_order_relaxed ?

DDD
DDDoriginal
2024-11-11 15:22:03598parcourir

Why set the stop flag using memory_order_seq_cst, if you check it with memory_order_relaxed?

Pourquoi définir le drapeau d'arrêt à l'aide de memory_order_seq_cst, si vous le vérifiez avec memory_order_relaxed ?

En vidéo, Herb Sutter, discute de la utilisation de l'atomique, y compris un exemple où un thread principal lance des threads de travail. Les travailleurs vérifient un indicateur d'arrêt et le thread principal définit finalement l'indicateur d'arrêt sur true à l'aide de memory_order_seq_cst. Sutter explique que vérifier l'indicateur avec memory_order_relaxed est acceptable car le délai d'arrêt d'un thread n'est pas significatif.

La question se pose de savoir pourquoi l'indicateur d'arrêt est défini avec memory_order_seq_cst au lieu de memory_order_relaxed.

mo_relaxed convient à la fois au chargement et au stockage d'un indicateur d'arrêt

Il n'y a aucun avantage significatif en matière de latence à des ordres de mémoire plus forts dans ce scénario, même si la latence de voir un changement dans un L'indicateur stop ou keep_running était important.

La norme ISO C ne précise pas à quelle vitesse les magasins deviennent visibles ni ce qui pourrait influencer cela. Cela nécessite seulement que les implémentations garantissent que la dernière valeur attribuée par une opération atomique ou de synchronisation devient visible à tous les autres threads dans un laps de temps fini.

La latence inter-thread est avant tout un problème de qualité de mise en œuvre, la norme laissant les choses grandes ouvertes. Les implémentations C normales compilent généralement en asm pour certaines architectures et exposent les propriétés de cohérence du cache du matériel, ce qui entraîne une faible latence entre les threads.

Sur le matériel réel qui utilise la cohérence du cache, les différents ordres de mémoire pour le stockage ou le chargement ne le font pas. rendre les magasins visibles plus tôt et en temps réel. Ils contrôlent si les opérations ultérieures peuvent devenir globalement visibles en attendant que le magasin s'engage du tampon du magasin vers le cache L1d.

Des commandes plus fortes et des barrières ne font pas que les choses se produisent plus tôt dans un sens absolu. Ils retardent d'autres choses jusqu'à ce qu'elles soient autorisées à se produire par rapport au magasin ou au chargement.

Avantages en termes de performances de l'utilisation de memory_order_relaxed pour le chargement

Utilisation de memory_order_relaxed pour le chargement présente les avantages suivants en termes de performances :

  • Évite les attentes inutiles pour la fin de la vérification, ce qui permet davantage de parallélisme au niveau des instructions et de la mémoire entre les itérations de boucle lorsque la charge produit un faux.
  • Évite les instructions supplémentaires sur les ISA où une acquisition ou une charge SC nécessite des instructions supplémentaires, telles que des instructions de barrière bidirectionnelle sur certaines architectures.

Dans ce scénario spécifique, où le drapeau d'arrêt est rarement défini, le gaspillage le travail dû aux fausses charges est minime. Par conséquent, les avantages en termes de performances de l'utilisation de memory_order_relaxed l'emportent sur les inconvénients potentiels.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn