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.
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.
Utilisation de memory_order_relaxed pour le chargement présente les avantages suivants en termes de performances :
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!