Équivalent interlocked sur Linux
-
02-07-2019 - |
Question
Dans une application C ++ Linux, quel est le moyen le plus simple d'obtenir la fonctionnalité que Fonctions interverrouillées sur Win32? Plus précisément, un moyen léger d’incrémenter ou d’ajouter atomiquement des entiers 32 ou 64 bits?
La solution 7
Après un examen plus approfondi, this Cela semble prometteur. Yay débordement de pile.
Autres conseils
Les ThreadBuildingBlocks Open Source d’Intel ont un modèle, Atomic, qui offre les mêmes fonctionnalités que la classe Interlocked de .NET. .
Contrairement aux programmes intégrés Atomic de gcc, il est multi-plateforme et ne dépend pas d'un compilateur particulier. Comme Nemanja Trifunovic le souligne à juste titre ci-dessus, cela dépend de la instruction de calcul de la CPU fournie par x86 et puces Itanium. Je suppose que vous ne vous attendriez à rien d'autre d'une bibliothèque Intel:)
Quelques notes pour clarifier le problème, qui n'a rien à voir avec Linux .
Les opérationsRWM (lecture-modification-écriture) et celles qui ne s'exécutent pas en une seule étape ont besoin du support matériel pour exécuter atomiquement ; parmi eux, incréments et décréments, fetch_and_add, etc.
Pour certaines architectures (notamment I386, AMD_64 et IA64), gcc prend en charge l’accès intégré à la mémoire atomique. Par conséquent, aucune bibliothèque externe n’est requise. Ici , vous pouvez lire des informations sur l'API. .
Strictement parlant, Linux ne peut pas offrir un "interlocked" atomique. fonctions comme celles de Win32, tout simplement parce que ces fonctions nécessitent un support matériel, et que Linux est exécuté sur certaines plates-formes n'offrant pas ce support. Cela dit, si vous pouvez vous contraindre à utiliser Intel x86 / x64, jetez un œil à la mise en oeuvre du comptage de références dans la bibliothèque de pointeurs partagés Boost.
Les fonctions atomic de Apache Portable Runtime sont vraiment proches. aux fonctions Win32 InterlockedXXX.
Vous pouvez insérer du code d'assemblage dans votre source pour utiliser directement des instructions imbriquées x68.
Vous devez utiliser une opération lock xadd .
Voir, par exemple, this .
La bibliothèque glib assez courante utilisée dans la programmation GTK et QT, ainsi que de manière autonome, offre une variété d'opérations atomiques. Voir http://library.gnome.org/devel/glib /2.16/glib-Atomic-Operations.html pour une liste. Il existe des fonctions g_atomic
pour la plupart des opérations prises en charge par Interlocked sous Win32 et sur les plates-formes où le matériel les prend directement en charge, elles sont intégrées au code d'assemblage requis.