Pourquoi le magasin de std::atomic utilise XCHG pour la cohérence séquentielle
Dans le contexte de std::atomic pour les architectures x86 et x86_64, un l'opération de stockage avec cohérence séquentielle (std::memory_order_seq_cst) utilise XCHG au lieu d'un simple magasin avec une barrière de mémoire comme technique pour obtenir une sémantique de libération séquentielle.
Cohérence séquentielle et xchg
La cohérence séquentielle dicte que toutes les opérations de mémoire semblent exécuter dans un ordre séquentiel, et cet ordre est le même pour tous les threads. XCHG, une instruction x86 qui échange atomiquement les valeurs de deux opérandes, satisfait intrinsèquement à cette exigence de cohérence séquentielle. En utilisant XCHG pour effectuer une opération d'écriture, std::atomic garantit que le magasin devient globalement visible par tous les threads à un moment spécifique de l'ordre d'exécution, empêchant ainsi la réorganisation avec les opérations ultérieures.
mov- store mfence vs XCHG
Alors qu'un simple mov-store suivi d'une barrière de mémoire (telle que mfence) pourrait théoriquement fournir une sémantique de version, cela n'est pas suffisant pour les opérations de magasin à libération séquentielle. MFENCE, une instruction de clôture de mémoire qui établit une barrière de mémoire, garantit que les opérations d'écriture précédentes sont validées en mémoire avant de continuer. Cependant, cela n'empêche pas les opérations de chargement ultérieures d'être réorganisées avant le magasin de versions.
Considérations relatives aux performances
Le choix entre mov-store mfence et XCHG pour la version séquentielle les opérations du magasin impliquent des compromis en termes de performances.
Mise en œuvre Détails
En pratique, l'implémentation spécifique du magasin de std::atomic avec cohérence séquentielle varie en fonction du compilateur et de l'architecture matérielle.
Acquisition implicite Clôture
L'affirmation selon laquelle les magasins x86 ont une clôture d'acquisition implicite est incorrecte. Les magasins sur x86 ont une sémantique de version et non d'acquisition. La sémantique d'acquisition est généralement appliquée à l'aide de barrières de mémoire telles que mfence ou d'opérations de lecture atomique avec la sémantique std::memory_order_acquire.
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!