en passant struct pour pthread comme argument
Ok je suis en train de passer une paire de nombres à travers struct
à pthread_create
fonction dans pthread
. Mais les chiffres, je suis de passage et les chiffres que j'obtiens lorsque la fonction est appelée sont différents et aléatoires
Ici est la struct
struct Pairs {
long i,j;
};
Et, à l'intérieur du
void main()
{
long thread_cmp_count = (long)n*(n-1)/2;
long t,index = 0;
struct Pairs *pair;
pair = malloc(sizeof(struct Pairs));
cmp_thread = malloc(thread_cmp_count*sizeof(pthread_t));
for(thread = 0;(thread < thread_cmp_count); thread++){
for(t = thread+1; t < n; t++){
(*pair).i = thread;
(*pair).j = t;
pthread_create(&cmp_thread[index++], NULL, Compare, (void*) pair);
}
}
for(thread= 0;(thread<thread_cmp_count); thread++){
pthread_join(cmp_thread[thread], NULL);
}
free(cmp_thread);
}
Et de la fonction Comparer
void* Compare(void* pair){
struct Pairs *my_pair = (struct Pairs*)pair;
printf("\nThread %ld, %ld", (*my_pair).i, (*my_pair).j);
return NULL;
}
Nombre que je suis arriver et il est également aléatoire.
Thread 0,2
Thread 1,2
Thread 2,3
Thread 2,3
Thread 2,3
Thread 2,3
suis-je en passant la struct
mal ?
Veuillez noter qu'en C, struct accède à l'aide d'un pointeur ne sont jamais écrit que
(*foo).bar
: au lieu d'utiliser foo->bar
.OriginalL'auteur Jos | 2013-11-25
Vous devez vous connecter pour publier un commentaire.
C'est parce que vous passez le pointeur de même pour tous les pthreads.
Lorsque vous appelez
pthread_create(..., (void*) pair)
vous passez le pointeur vers le nouveau thread, mais dans la prochaine itération, vous l'écrasez que la mémoire (potentiellement avant le nouveau thread a extrait de ces valeurs)..
OriginalL'auteur Sergey L.
Le problème est résolu. Problème était avec chevauchement. à l'aide de pointeur comme
array
de typestruct
Paires, il est résoluVoici le bon code
Et la fonction de Comparer
OriginalL'auteur Jos