Maison >développement back-end >C++ >`std::atomic` utilise-t-il un verrou caché et, si oui, où se trouve-t-il ?
Où std::atomic cache-t-il son verrou ?
Dans les structures de données multi-éléments, les types atomiques standard ne sont pas toujours verrouillés. gratuit. Ceci est attribué à l'incapacité du processeur à traiter ces données sans l'aide d'un verrou. Pour illustrer, considérons l'exemple suivant :
#include <iostream> #include <atomic> struct foo { double a; double b; }; std::atomic<foo> var; int main() { std::cout << var.is_lock_free() << std::endl; std::cout << sizeof(foo) << std::endl; std::cout << sizeof(var) << std::endl; }
Sa sortie pour Linux/gcc révèle ce qui suit :
0 16 16
En supposant que le type atomique et la structure foo occupent la même quantité d'espace , il semble peu probable qu'un verrou soit stocké dans l'atome. Mais quelle est exactement la vérité derrière cette énigme ?
Emplacement du verrouillage et implications pour plusieurs instances
L'approche habituelle consiste à utiliser une table de hachage de mutex (ou spinlocks) à clé à l'adresse de l'objet atomique. Cette fonction de hachage privilégie les bits les plus bas de l'adresse en tant qu'index dans un tableau de taille 2 ^ n.
Sinon, l'implémentation LLVM std::atomic intègre des bits d'adresse plus élevés pour empêcher l'alias automatique. Cela garantit que les objets séparés par une puissance significative de 2 ne sont pas mappés sur le même verrou.
Il est important de noter que les objets atomiques ne fonctionnent sans verrouillage que lorsqu'ils sont partagés en mémoire entre des processus distincts, où chaque processus est équipé avec sa propre table de hachage de verrous.
Les collisions au sein de la table de hachage peuvent justifier la prudence. Bien que cela ne pose aucun problème d'exactitude, cela pourrait nuire aux performances en favorisant les conflits entre plusieurs threads. Cependant, il s'agit d'un événement relativement rare, car les objets atomiques sans verrouillage sont généralement favorisés sur les plates-formes préoccupantes.
En ce qui concerne les blocages, soyez assuré que ce n'est pas un problème car les fonctions std::atomic s'abstiennent d'acquérir des verrous. sur plusieurs objets simultanément. Par conséquent, le code de la bibliothèque responsable de l'acquisition du verrou ne tente jamais de sécuriser un verrou supplémentaire tout en détenant un verrou existant.
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!