2010-11-01 26 views
4

Étant donné que chaque compilateur a sa propre version de stockage local de thread, j'ai fini par créer une macro pour cela. Le seul problème est maintenant GCC (avec pthreads est désactivé), ce qui me donne:"stockage local-thread non pris en charge pour cette cible", #ifdef?

« le stockage local des threads non pris en charge pour cet objectif »

assez juste, étant donné que pthreads sont effectivement éteints dans ce cas. La question est, existe-t-il une façon générique de détecter cela en utilisant une macro par ex. #ifdef __GCC_XXX_NO_THREADS_XXX?

EDIT: Voir la réponse acceptée ci-dessous. En outre, voici ma solution paresseuse:


$ touch test.c 
$ gcc -E -dM test.c > out.1 
$ gcc -pthread -E -dM test.c > out.2 
$ diff out.* 
28a29 
> #define _REENTRANT 1 

Ceci est sous Mac OS X. Je ne suis pas sûr que ce soit portable ou quoi que ce soit ...

Répondre

6

Votre ligne de commande de compilation a -lpthread ou pas: Vous pouvez également y inclure un -DHAVE_PTHREADS.

Si vous voulez vraiment GCC/ELF dectection d'exécution spécifique, vous pouvez recourir à des refs faibles:

#include <pthread.h> 

extern void *pthread_getspecific(pthread_key_t key) __attribute__ ((weak)); 

int 
main() 
{ 
    if (pthread_getspecific) 
     printf("have pthreads\n"); 
    else 
     printf("no pthreads\n"); 
} 

est ici à quoi il ressemble:

$ gcc -o x x.c 
$ ./x 
no pthreads 
$ gcc -o x x.c -lpthread 
$ ./x 
have pthreads 
+0

Merci de me rappeler de __attribute __ (faible). Et oui, évidemment vous avez raison d'utiliser une macro. Ma question est plus du type paresseux :), mais aussi parce que je suis curieux de la réponse. – Krumelur

1

Si vous utilisez autoconf pour votre projet, vous trouverez peut-être ax_tls.m4 utile.

+0

Mais je ne (heureusement):). Pour l'anecdote, j'utilise cmake, mais je préférerais l'avoir directement dans le fichier header si possible, puisque je suis en train de pirater un petit prototype en ce moment ... – Krumelur

+0

grep/usr/include suggère que __GTHREADS est utilisé en interne dans un certain nombre de fichiers d'en-tête, mais cela semble assez peu fiable et non destiné à un usage public. – Flexo

+0

Juste pour le plaisir, j'ai essayé mon truc sur une machine Ubuntu. A donné le même résultat (c'est-à-dire _REENTRANT). En lisant l'en-tête, cela ressemble plus à si __GTHREADS est lié à si gcc a été compilé avec le support des threads ou non. Mais je ne sais pas ... Je devrais probablement revenir à ce que je faisais à la place :) – Krumelur