2011-11-05 2 views
5

Sono coreano e non sono bravo in inglese ma se mi dai un commento laggiù
Sarò molto contento e proverò a capirlo.pthread (errore di segmentazione)

Ho creato, ad esempio, 10 thread e ho cercato di unirli dopo la creazione e restituire il valore.
Ma quando mi unisco all'ultimo thread, ottengo un errore di segmentazione.

Il risultato viene fuori come questo ..

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) 

quando creo 4 thread è come

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) 

io non riesco a trovare il motivo.

#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

Non riesco a riprodurre questo, ho provato 2 e 4 thread. Funziona perfettamente bene, anche all'interno di Valgrind. Puoi dirci qualcos'altro sul problema? – VolatileDream

+1

Hai provato un debugger? gdb è tuo amico. – vanza

+1

Benvenuti in SO. :-) –

risposta

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

Hai solo allocato spazio per due elementi qui, quindi se si avvia più di 2 discussioni si incorrerà al largo della fine della matrice e potenzialmente crash o corrompere lo stack.

Inoltre:

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

status è un int, non un void *; tentando di provare a memorizzare un void * in un int. Su molte piattaforme a 64-bit, questo verrà in overflow (poiché void * sarà 8 byte mentre int è 4). Crea status a void * e interrompi il tentativo di eliminare errori del compilatore come questo. Sono errori per una ragione.

+0

quando lancio più di 2 thread ho cambiato quei numeri. – IKS

+0

Buon punto, ma non possiamo ancora spiegare il segfault su 2 thread. – VolatileDream

+0

@IKS, dovrai mostrare il codice in cui hai cambiato quei numeri, quindi è perfettamente possibile che tu abbia dimenticato di cambiarne uno. Meglio ancora, inizia a usare '# define's o una variabile per definire quanti thread avviare, ed avere sia i loop che le allocazioni di array usano questa variabile/macro, per prevenire incongruenze. – bdonlan