2010-04-21 31 views
10

Estoy usando pthread.h en un archivo *.cc. cuando trato de usar pthread_exit(0); o pthread_join(mythrds[yy],NULL); que dice:Usando pthread en C++

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

cuando cumplido código muy similar en un archivo *.c con gcc que funciona perfecto. ¿Cómo puedo utilizar de pthread en C++ .. (También he añadido -lpthread)

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

banderas:

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

Respuesta

21

Puede intentar usar la opción -pthread para g ++.

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

suena mucho, fue de gran ayuda. Pensé que "lpthread estaba haciendo lo mismo, pero no es así". – ogzylz

+0

Puede averiguar qué hace -pthread en su plataforma usando 'gcc -dumpspecs' y buscando cosas que comiencen '% {pthread' – Flexo

+0

La opción '-lpthread' solo incluye la biblioteca pthread. Eso puede no ser suficiente en su plataforma para obtener soporte pthreads. –

1

¿Sus archivos de cabecera pthread extern "C" { ... } alrededor de los prototipos de las funciones? Ese es el caso habitual para el enlazador que no puede enlazar en C++.

Ocurre porque C++ generalmente hace cambios de nombre para que pueda codificar detalles de parámetros en símbolos (lo que permite el polimorfismo). Por ejemplo, las funciones:

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

obtienen diferentes símbolos de vinculador.

Si los archivos de cabecera hacer no tienen la extern "C" { ... }, puede que tenga que hacerlo usted mismo:

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

de esperar que funcione.

+0

pero el problema no era ése. – ogzylz