2010-04-21 3 views
10

J'utilise pthread.h dans un fichier *.cc. lorsque je tente d'utiliser pthread_exit(0); ou pthread_join(mythrds[yy],NULL); il est dit:Utilisation de pthread en C++

.cc:(.text+0x3e): undefined reference to `pthread_exit' 

il est respecté le code très similaire dans un fichier *.c avec gcc il fonctionne parfaitement. Comment puis-je utiliser des années pthread dans C++ .. (J'ai aussi ajouté -lpthread)

.. 
void *myThreads (void *ptr) 
{ 
... 
pthread_exit(0); 
} 
.. 

drapeaux:

g++ -lpthread -Wall -static -W -O9 -funroll-all-loops -finline -ffast-math 

Répondre

21

Vous pouvez essayer d'utiliser l'option -pthread pour g ++.

-pthread 
     Adds support for multithreading with the pthreads library. This 
     option sets flags for both the preprocessor and linker. 
+0

thnks beaucoup, il reaaaaaaaallly aidé. J'ai pensé -lpthread faisait la même chose mais ce n'est pas le cas. – ogzylz

+0

Vous pouvez trouver ce que -pthread fait sur votre plate-forme en utilisant 'gcc -dumpspecs' et en recherchant les choses qui commencent '% {pthread' – Flexo

+0

L'option '-lpthread' n'inclut que la bibliothèque pthread. Cela peut ne pas suffire sur votre plate-forme pour obtenir le support de pthreads. –

1

Vos fichiers d'en-tête de pthread ont extern "C" { ... } autour des prototypes de fonction? C'est le cas habituel pour l'éditeur de liens qui ne peut pas créer de lien en C++.

Cela se produit parce que C++ fait généralement le nommage-mangling afin qu'il puisse encoder les détails des paramètres en symboles (permettant le polymorphisme). Par exemple, les fonctions:

void x(int); 
void x(void); 
void x(char,int,float,double); 

obtiennent des symboles de liaison différents.

Si les fichiers d'en-tête ne pas ont le extern "C" { ... }, vous devrez peut-être de le faire vous-même:

extern "C" { 
    #include <pthread.h> 
} 

Espérons que cela fonctionnera.

+0

thnk mais le problème n'était pas cela. – ogzylz