À l'aide de gcc atomique objets internes?
Je suis en train d'utiliser __atomic_load_n
de la gcc
atomique les builtins page, la compilation avec
gcc -Wall -march=i686 -std=gnu99 ll.c -o ll
mais il me dit qu'il ne peut pas
avertissement: déclaration implicite de la fonction "__atomique_charger_n"
Je pensais que ce serait assez pour fournir gcc
avec le arch
et la march
drapeaux (et par la définition de la std=gnu99
drapeau), mais en vain. En fait, même si je test pour la commune __GCC_VERSION__
ou __GNUC__
macros ne semblent pas avoir de valeurs... mais j'ai une jolie vanille gcc
de l'installation, celui qui vient dans Ubuntu.
Je sais que je suis en train de faire quelque chose de stupide, mais je ne peux pas comprendre ce que. J'ai le gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Code ressemble à ceci: c'est une fonction qui n'est jamais appelé (encore), de sorte que le problème est au moment de la compilation.
type* func(type* p) {
type* q = __atomic_load_n (p, __ATOMIC_SEQ_CST);
}
- Pouvez-vous nous montrer le code que vous offre l'erreur?
- bien sûr, les questions a été mis à jour.
- Je peux compiler votre code ne pose aucun problème (gcc 4.7.2) une fois que j'ai typedef
type
àint
. Si vous soupçonnez un problème avec votre compilateur d'installation, peut-être essayer de construire un non-trival mais propre projet avec elle pour voir ce qui se passe? - Oh, bien. On dirait qu'il est temps de recompiler gcc 🙁 Il y va d'une heure. Merci.
- Je crois que le
__atomic_*
fonctions ont été ajoutées en 4.7. Les versions précédentes ont__sync_*
fonctions qui répondent à un objectif similaire. - comme @KerrekSB dit, cela a été introduit dans GCC 4.7 Vérifier GCC 4.6.3 de la documentation: gcc.gnu.org/onlinedocs/gcc-4.6.3/gcc
- Depuis que vous avez été le premier à le dire, l'esprit en ajoutant les vôtres comme une réponse afin que je puisse l'accepter?
- OK, en fait 🙂
Vous devez vous connecter pour publier un commentaire.
Jusqu'GCC 4.6.3, compilateur built-ins pour les opérations atomiques ont été un pur compilateur extension, et dans le CCAG ils ont été regroupés dans la
__synchronisation_*
famille de fonctions.De la version 4.7.0, à la fois le C++11 et le C11 normes avaient été finalisé, et GCC mis à jour leur atomique built-ins afin de mieux refléter le nouveau modèle de mémoire de ces deux nouvelles langues révisions. Les nouvelles fonctions sont regroupées dans le
__atomique_*
famille.Toutefois, l'ancienne built-ins sont toujours disponible, et la la documentation dit ceci:
__ATOMIC_SEQ_CST
est toujours valide, il peut vous donner de jolis résultats sous-optimaux, de couirse selon le modèle de mémoire de votre CPU.