Maison >développement back-end >C++ >Comment un compteur atomique 64 bits peut-il être implémenté en utilisant uniquement des compteurs atomiques 32 bits ?

Comment un compteur atomique 64 bits peut-il être implémenté en utilisant uniquement des compteurs atomiques 32 bits ?

DDD
DDDoriginal
2024-12-09 04:52:17969parcourir

How Can a 64-Bit Atomic Counter Be Implemented Using Only 32-Bit Atomics?

Implémentation d'un compteur atomique 64 bits à l'aide d'atomes 32 bits

Cette question explore la création d'un compteur atomique 64 bits à partir d'entiers atomiques 32 bits. Le compteur a un seul écrivain et plusieurs lecteurs, l'écrivain étant un gestionnaire de signal qui ne doit pas bloquer.

La solution proposée utilise un décompte de générations, utilisant le bit faible comme verrou de lecture. Les lecteurs réessayent jusqu'à ce que le nombre de générations soit stable tout au long de la lecture et que le bit faible ne soit pas défini.

Conception et ordre de la mémoire

Le code fourni suit généralement les principes de conception corrects d'un SeqLock, un modèle pour implémenter des compteurs atomiques sans verrouillage avec des numéros de séquence. L'utilisation de l'ordre de la mémoire est judicieuse, garantissant que le compteur est mis à jour de manière atomique.

Améliorations potentielles

Cependant, il convient de noter que l'utilisation d'opérations RMW atomiques pour l'incrément de la charge utile est inutile si le Le système prend en charge l'ajout ou la charge atomique 64 bits moins cher. Au lieu de cela, un simple chargement des deux moitiés, suivi d'un incrément non atomique et d'un stockage atomique du résultat est suffisant.

De plus, le compteur de séquence peut également éviter les opérations RMW atomiques à moins qu'il ne soit utilisé comme verrou tournant avec plusieurs écrivains. Avec un seul écrivain, il peut utiliser des charges pures et des magasins purs avec commande de versions, qui sont plus efficaces que le RMW atomique ou les magasins avec commande seq_cst.

Optimisations et alternatives

Pour contourner les limitations de atomique pour les types plus grands, on pourrait envisager d'utiliser une union d'un uint64_t volatile et d'un atomique. Cela permettrait des opérations de chargement et de stockage efficaces.

Une autre alternative serait d'implémenter un modèle SeqLock qui vérifie dynamiquement si la cible prend en charge les opérations atomiques sans verrouillage sur atomique. Sinon, il pourrait de manière transparente revenir à une implémentation différente qui évite d'utiliser des opérations RMW atomiques.

En conclusion, alors que le code fourni présente une implémentation fonctionnelle d'un compteur atomique 64 bits utilisant des atomes 32 bits, il sont des optimisations et des alternatives potentielles qui pourraient améliorer les performances et simplifier le code.

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!

Déclaration:
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