Maison > Article > développement back-end > Pourquoi « std :: atomic » utilise-t-il XCHG pour garantir la cohérence séquentielle dans les magasins ?
Le rôle de XCHG dans la garantie de la cohérence séquentielle dans les magasins std::atomic
Bien qu'il puisse sembler intuitif d'employer un magasin ordinaire suivi d'une lecture /barrière de mémoire d'écriture pour obtenir une cohérence séquentielle, magasin std::atomic avec commande de cohérence séquentielle (seq_cst) utilise à la place XCHG. Cette approche est justifiée par les caractéristiques spécifiques de XCHG dans les architectures x86 et x86_64.
Atomic RMW et Full Memory Barriers
Sur les architectures x86, la lecture-modification-écriture atomique (RMW), telles que XCHG, agissent intrinsèquement comme des barrières de mémoire complète. Le préfixe de verrouillage implicite sur XCHG applique un ordre global, garantissant que les opérations de chargement et de stockage qu'il effectue ne peuvent pas être séparées par une mise en mémoire tampon ou une réorganisation chargement-chargement.
Cohérence séquentielle vs. libération séquentielle
Les opérations de magasin ordinaires sur x86 possèdent une sémantique de version, qui leur permet de réorganiser avec des opérations ultérieures, y compris l'acquisition de charges. Pour garantir la cohérence séquentielle, une barrière de libération séquentielle, plutôt qu'une barrière de libération seule, serait nécessaire.
Considérations relatives aux performances
Choisir entre MFENCE et XCHG pour la mise en œuvre des magasins seq_cst implique des compromis en termes de performances. Alors que MFENCE bloque l'exécution dans le désordre sur Intel Skylake et les architectures ultérieures, ce n'est pas le cas de XCHG. Cette différence peut avoir un impact sur l'exécution du code environnant. D'autres facteurs, tels que l'état du cache et les conflits de threads, peuvent également affecter les performances.
Recommandations du compilateur et du noyau
Les versions récentes de GCC et les compilateurs modernes privilégient XCHG plutôt que MFENCE pour seq_cst est stocké sur la plupart des plateformes. Le noyau Linux utilise XCHG pour les magasins atomiques seq_cst, tandis qu'il utilise à la fois XCHG et MFENCE pour différents types de barrières de mémoire.
Barrières de mémoire implicites dans x86
La déclaration impliquant le fait que les magasins x86 et x86_64 possèdent une clôture d'acquisition implicite est incorrect. Les magasins sur ces architectures ont une sémantique de version par défaut. Pour acquérir la sémantique, une opération d'acquisition doit être explicitement spécifiée.
Conclusion
L'utilisation de XCHG dans les magasins seq_cst de std::atomic garantit la cohérence séquentielle sur les plateformes x86 et x86_64 en exploitant les propriétés de barrière de mémoire complète inhérentes aux opérations RMW. D'autres options, telles que MFENCE, peuvent offrir des garanties plus faibles ou des caractéristiques de performances différentes en fonction du matériel spécifique et des conditions de fonctionnement.
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!