Maison > développement back-end > C++ > `std::atomic` utilise-t-il un verrou caché et, si oui, où se trouve-t-il ?

`std::atomic` utilise-t-il un verrou caché et, si oui, où se trouve-t-il ?

DDD
Libérer: 2024-12-03 21:31:11
original
828 Les gens l'ont consulté

Does `std::atomic` Use a Hidden Lock and, If So, Where Is It Located?

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;
}
Copier après la connexion

Sa sortie pour Linux/gcc révèle ce qui suit :

0
16
16
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal