Bien que C 11 prenne en charge std::atomic
x86_64 prend en charge les opérations atomiques suivantes sur les doubles, effectuées à l'aide de lock- gratuit instructions :
Malheureusement, il existe aucun moyen de garantir l'atomicité des magasins ou des charges de vecteurs 128b ou 256b à travers le système de cohérence du cache. Cependant, pour les vecteurs alignés, vous pouvez utiliser en toute sécurité des charges vectorielles et des magasins sur des tableaux doubles partagés sans risque de déchirure.
Si des charges atomiques 16B sont requises, votre seule option est d'utiliser le verrou cmpxchg16b avec désiré = attendu. s'il réussit, il remplace la valeur existante par elle-même. En cas d'échec, vous récupérez l'ancien contenu. Notez que ce "chargement" échoue sur la mémoire en lecture seule, alors soyez prudent lorsque vous passez des pointeurs vers des fonctions qui effectuent cette opération.
Les magasins Atomic 16B et RMW peuvent tous deux utiliser le verrou cmpxchg16b de manière évidente. Cela rend les magasins purs beaucoup plus chers que les magasins vectoriels classiques, en particulier avec plusieurs tentatives cmpxchg16b. Cependant, le RMW atomique est déjà cher.
Vous pouvez mettre à jour atomiquement les objets 16B mais lire les moitiés 8B séparément. Cependant, les compilateurs ne fournissent pas de moyen propre d'exprimer cela, et l'inclusion de cmpxchg16b n'est pas fiable en raison de considérations continues de la part des développeurs du compilateur.
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!