Argument Linux Pthread

Ceci est mon code. C’est très simple.

#include  #include  #include  void *func(void *arg) { printf("ID=%d\n", *(int*)arg); pthread_exit(NULL); } int main() { pthread_t pt[4]; int i; for (i = 0; i < 4; i++) { int temp = i; pthread_create(&pt[i], NULL, func, (void*)&temp); } sleep(1); return 0; } 

Je l’ai compilé:

gcc p_test.c -lpthread

Je l’ai couru. Il a imprimé 2 2 3 3 . Je l’ai couru à nouveau. Il a imprimé 2 3 3 2 .

Mon problème est:

Pourquoi 2 ou 3 ils été imprimés deux fois?

Pourquoi n’a-t-il pas imprimé 1 3 2 0 ou d’autres résultats?

Le problème majeur ici est que vous prenez l’adresse de la variable locale temp , puis que vous utilisez ce pointeur en dehors de la scope de la variable – dès que vous quittez une itération de la boucle, votre pointeur sur temp devient invalide et vous devez ne pas le déréférencer.

Vous passez un pointeur sur une variable temporaire dans la fonction de création de thread et ce dernier disparaît de la scope à la fin du bloc de boucle. Il me semble que l’adresse temporaire est réutilisée par le compilateur et que, lorsque les threads sont en cours d’exécution, ils voient le même emplacement d’adresse.

Si tu fais:

 int *temp = malloc(sizeof(int)); *temp = i; pthread_create(&pt[i], NULL, func, (void*)temp); 

au lieu de cela, vous devriez voir les résultats que vous attendez.

Dans ce cas, la fonction de thread doit libérer l’ int après son impression pour éviter une fuite de mémoire.

En outre, il est préférable de pthread_join() les threads que vous attendez plutôt que de simplement sleep() ing.

Comme il imprime temp, tous les threads partagent la mémoire (TheJuice explique pourquoi temp est “partagé”), de sorte que tous les threads “partagent” temp. Utilisez un mutex ou faites de temp une variable privée. Variables privées dans les threads

Ou vous pouvez utiliser phtread_join comme ceci:

 int main() { pthread_t pt[4]; int i; for (i =0 ; i < 4; i++) { pthread_create(&pt[i], NULL, func, (void*)&i); pthread_join(pt[i],NULL); } //sleep(1); return 0; } 
 #include  #include  #include  void *func(void* arg) { printf("ID=%d\n", (int)arg); pthread_exit(NULL); return 0; } int main() { pthread_t pt[4]; int i; for (i =0 ; i < 4; i++) { pthread_create(&pt[i], NULL, func, (void*)i); pthread_join(pt[i],NULL); } return 0; 

}