Confus à propos de l’argument dans pthread_create ()

Ma question: pourquoi ne pas simplement passer & i comme dernier argument de pthread_create ()? à la place, il crée un tableau contenant la même chose ….

#define THREAD_CT 2 /* bump this up a few numbers if you like */ void *print_stuff(void *ptr) { int i, id= * (int *) ptr; for (i= 0; i < 5; i++) { printf("Thread %d, loop %d.\n", id, i); sleep(rand() % 2); /* sleep 0 or 1 seconds */ } printf("Thread %d exiting.\n", id); return NULL; } int main(void) { pthread_t tids[THREAD_CT]; int i, ids[THREAD_CT]; for (i= 0; i < THREAD_CT; i++) { ids[i]= i; pthread_create(&tids[i], NULL, print_stuff, &ids[i]); printf("Main thread created thread %d (ID %ld).\n", i, tids[i]); } for (i= 0; i < THREAD_CT; i++) { pthread_join(tids[i], NULL); printf("Main thread reaped thread %d (ID %ld).\n", i, tids[i]); } return 0; } 

pourquoi ne pas simplement passer & i comme dernier argument de pthread_create ()?

Parce que si vous faites cela, tous les threads partageront l’adresse i et il y aura une course de données entre les threads.

L’alternative consiste à atsortingbuer la valeur comme:

 pthread_create(&tids[i], NULL, print_stuff, (void *)i); 

Mais cette conversion d’entier en pointeur a un comportement défini par l’implémentation . Donc, la façon dont vous l’avez maintenant est probablement la meilleure façon

Notez également que rand() n’est pas thread-safe.