2009-11-10 3 views
0

J'essayais d'écrire un simple programme multithread. Il décharge le noyau. J'ai ma fonction qui est appelée lorsqu'un thread est créé ci-dessous:core dump dans un programme multithread

void *BusyWork(void *t) 
{ 
    int i; 
    int *tid; 
    int result=0; 
    tid = t; 

    printf("Thread %d starting...\n",*tid); 
    for (i=0; i<10; i++) 
    { 
     result = result + (i* i); 
    } 
    printf("thread %d is sleeping for %d sec's\n",tid,tid); 
    sleep(tid); 
    printf("Thread %d done. Result = %e\n",tid, result); 
    pthread_exit((void*) t); 
} 

Mon appel à pthread_create fonction est inférieure à l'intérieur de la fonction principale:

int t; 

for(t=0; t<NUM_THREADS; t++) 
{ 
     printf("Main: creating thread %d\n", t); 
     rc = pthread_create(&thread[t], &attr, BusyWork, (void *)t); 
} 

S'il vous plaît aidez-moi à trouver où est le problème? Merci d'avance.

Répondre

0

Cette ligne est faux:

printf("Thread %d starting...\n",*tid); 

Vous pouvez réaliser ce que vous voulez avec:

printf("Thread %d starting...\n",(int) t); 

ou printf ("de départ du fil% d ... \ n", tid);

+0

merci beaucoup gonzalo. – Vijay

0

A partir de cette ligne:

printf("thread %d is sleeping... 

Toutes les références à tid devrait être *tid.

+0

salut paul ... pourriez-vous s'il vous plaît expliquer aussi pourquoi? – Vijay

+0

Parce que tid n'est pas un entier, mais un pointeur vers un entier. C étant si tolérant qu'il est de types entiers, vous pouvez réellement obtenir une valeur de sortie, mais ce ne sera pas un bon entier sympathique comme 4 ou 7, mais une adresse de mémoire de 32 bits qui * pointe * vers un 4 ou un 7. Puisque votre processus de thread ne modifie pas la valeur pointée par ce pointeur, je suggérerais de changer votre déclaration de tid de 'int * tid' à' int tid', et de l'assigner en utilisant 'tid = * t; c'est juste un entier simple. Rien de tout cela explique pourquoi vous obtenez un vidage de base cependant. – PaulMcG

+0

Wow, mes compétences en débogage C * sont * rouillées! Vous passez la valeur int * valeur * t de la fonction principale, mais la déréférencer comme int * pointeur *. t a les valeurs de 0 à NUM_THREADS-1, donc dès que votre thread essaie de deref tid dans le premier printf, il souffle. Faites le changement que j'ai suggéré dans ma réponse, mais * changez aussi l'appel pour passer '(void *) & t', pas seulement' (void *) t' - ceci change l'appel pour passer l'adresse de t, pas la valeur de t. – PaulMcG

Questions connexes