2011-11-05 17 views
5

Soy coreano y no soy bueno en inglés, pero si me da un comentario allí abajo
Estaré muy contento y trataré de entenderlo.pthread (fallo de segmentación)

Creé, por ejemplo, 10 hilos e intenté unirlos después de la creación y devolví el valor.
Pero cuando me uno al último hilo, aparece un error de segmentación.

El resultado sale como esta ..

Before Thread 1 create 
After Thread 1 create 
Before Thread 0 create 
After Thread 0 create 
Before Thread 1 join 
After Thread 1 join 
Before Thread 0 join 
Segmentation Fault(core dumped) 

cuando creo 4 hilos es como

Before Thread 3 create 
After Thread 3 create 
Before Thread 2 create 
After Thread 2 create 
Before Thread 1 create 
After Thread 1 create 
Before Thread 0 create 
After Thread 0 create 
Before Thread 3 join 
After Thread 3 join 
Before Thread 2 join 
After Thread 2 join 
Before Thread 1 join 
After Thread 1 join 
Before Thread 0 join 
Segmentation Fault(core dumped) 

Me parece que no puede encontrar por qué.

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <unistd.h> 

pthread_mutex_t mutex_lock; 

struct arg_struct { 
     int a; 
     int b; 
}; 

void *t_function(void *data) { 
     pthread_mutex_lock(&mutex_lock); 

     struct arg_struct *arg = (struct arg_struct *)data; 
     long int s; 

     s = arg->a; 

     pthread_mutex_unlock(&mutex_lock); 

     return (void **)s; 
} 

int main() 
{ 
     int i; 

     pthread_t p_thread[2]; 
     int thr_id; 
     int status; 

     struct arg_struct arg[2]; 

     for(i = 1; i >= 0; i--) { 
       arg[i].a = i; 
       arg[i].b = i; 
     } 

     pthread_mutex_init(&mutex_lock, NULL); 

     for(i = 1; i >= 0; i--) { 
       printf("Before Thread %d create\n", i); 
       thr_id = pthread_create(&p_thread[i],NULL, t_function, (void *)&arg[i]); 
       printf("After Thread %d create\n", i); 
       usleep(1000); 
     } 

     int temp[2]; 

     for(i = 1; i >= 0; i--) { 
       printf("Before Thread %d join\n", i); 
       pthread_join(p_thread[i], (void**)&status); 
       printf("After Thread %d join\n", i); 
       temp[i] = status; 
     }i 

     printf("%d%d", temp[1], temp[0]); 

     pthread_mutex_destroy(&mutex_lock); 

     return 0; 
} 
+0

No puedo reproducir esto, he intentado 2 y 4 hilos. Funciona perfectamente bien, incluso dentro de Valgrind. ¿Puedes decirnos algo más sobre el problema? – VolatileDream

+1

¿Has probado un depurador? gdb es tu amigo – vanza

+1

Bienvenido a SO. :-) –

Respuesta

9
pthread_t p_thread[2]; 
    struct arg_struct arg[2]; 
    int temp[2]; 

Sólo se asigna espacio para dos elementos aquí, así que si usted lanza más de 2 hilos que se encontrará fuera de la final de la matriz y potencialmente chocar o corromper la pila.

Además:

  pthread_join(p_thread[i], (void**)&status); 

status es un int, no un void *; intentando esto intentará almacenar un void * en un int. En muchas plataformas de 64 bits, esto también se desbordará (ya que void * tendrá 8 bytes, mientras que int es 4). Haga status a void *, y deje de intentar descartar errores de compilación como este. Son errores por una razón.

+0

cuando lanzo más de 2 hilos, cambié esos números. – IKS

+0

Buen punto, pero aún no podemos explicar la segfault en 2 hilos. – VolatileDream

+0

@IKS, tendrá que mostrar el código donde cambió esos números, entonces es perfectamente posible que haya olvidado cambiar uno. Mejor aún, comience a usar '# define's o una variable para definir cuántos subprocesos lanzar, y tenga tanto los bucles como las asignaciones de matrices, use esta variable/macro para evitar incoherencias. – bdonlan

Cuestiones relacionadas