2009-05-30 7 views
11

Je suis en train de mettre en œuvre un mécanisme sans verrou à l'aide d'instructions de comparaison et de permutation atomique (double), par ex. Je suis en train d'écrire ceci dans l'assemblage, puis de le lier. Cependant, je me demandais s'il y avait un moyen d'obtenir le compilateur pour faire cela automatiquement pour moi? par exemple. bloc de code surround avec «atomiquement» et le faire comprendre comment implémenter le code comme une instruction atomique dans l'architecture du processeur sous-jacent (ou générer une erreur à la compilation si l'arc sous-jacent ne le supporte pas)?Opérations atomiques en C++ pour les structures sans verrou

P.S. Je sais que gcc a quelques Encastrements (au moins pour CAS)

http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Atomic-Builtins.html#Atomic-Builtins

Répondre

11

On a déjà répondu here.

Le standard C++ 0x fournira quelques atomic datatypes, principalement des types entier et void utilisant le modèle std :: atomic <>. Cet article mentionne Boehm's atomic_ops project que vous pouvez télécharger et utiliser aujourd'hui. Si ce n'est pas le cas, ne pouvez-vous pas implémenter votre assembleur en ligne dans le compilateur? Je sais MSVC a le mot-clé __asm pour les routines assembleur en ligne. Google dit yes, gcc can do it too.

+8

MSVC a des ops imbriqués, et GCC a des fonctions d'opérations atomiques intégrées, il n'est donc pas nécessaire de faire un assembleur en ligne. En utilisant les wrappers du compilateur, vous resterez portable sur toutes les plates-formes supportées par le compilateur. – bdonlan

+0

MSVC a des ops imbriqués pour les types de données longs seulement, l'OP voulait des doubles. – gbjbaanb

+0

gcc n'a pas d'opérations intégrées pour DWCAS. MSVC a construit pour DWCAS. Aucun OS n'a de DW (mot double, par exemple deux longueurs de pointeur, côte à côte) pour l'incrémentation, la décrémentation, etc. - DW n'existe que et n'existe que (et n'a jamais existé) pour CAS. –

5

L'avenir "C++ 0x" standard C++ soutiendra les opérations atomiques & c - voir par exemple http://www.open-std.org/JTC1/sc22/wg21/docs/papers/2007/n2427.html pour une discussion raisonnablement approfondie. Jusqu'à ce que cette norme à venir soit approuvée et largement mise en œuvre, bien sûr, il n'y a aucun moyen d'obtenir une telle fonctionnalité de manière "portative" entre les compilateurs; Si vous êtes intéressé par des compilateurs spécifiques au-delà de gcc, vous pouvez peut-être ouvrir une autre question spécifique à leur sujet.

+0

Je ne sais pas s'il me manque quelque chose mais l'article lié ne semble pas pertinent. – bugmenot77

+0

Vous avez raison, collé la mauvaise URL - en cours d'édition pour corriger, merci! –

Questions connexes