c en passant plusieurs arguments aux threads

quand je crée un fil, je veux passer plusieurs arguments. Donc, je définis dans un fichier d’en-tête ce qui suit:

struct data{ char *palabra; char *directorio; FILE *fd; DIR *diro; struct dirent *strdir; 

};

Dans un fichier .c je fais ce qui suit

 if (pthread_create ( &thread_id[i], NULL, &hilos_hijos, ??? ) != 0){ perror("Error al crear el hilo. \n"); exit(EXIT_FAILURE); } 

Comment puis-je passer tous ces arguments aux threads. Je pensais à propos de:

1) utilisez d’abord malloc pour allouer de la mémoire à cette structure, puis atsortingbuez une valeur à chaque paramètre:

  struct data *info info = malloc(sizeof(struct data)); info->palabra = ...; 

2) définir

  struct data info info.palabra = ... ; info.directorio = ...; 

et ensuite, comment puis-je accéder à ces parameters dans le fil void thread_function (void * arguments) {??? }

Merci d’avance

Voici un exemple de travail (et relativement petit):

 #include  #include  #include  #include  /* * To comstack: * cc thread.c -o thread-test -lpthread */ struct info { char first_name[64]; char last_name[64]; }; void *thread_worker(void *data) { int i; struct info *info = data; for (i = 0; i < 100; i++) { printf("Hello, %s %s!\n", info->first_name, info->last_name); } } int main(int argc, char **argv) { pthread_t thread_id; struct info *info = malloc(sizeof(struct info)); strcpy(info->first_name, "Sean"); strcpy(info->last_name, "Bright"); if (pthread_create(&thread_id, NULL, thread_worker, info)) { fprintf(stderr, "No threads for you.\n"); return 1; } pthread_join(thread_id, NULL); return 0; } 

Ne pas utiliser l’option n ° 2. La structure de data peut être écrasée (explicitement, par exemple en utilisant la même structure pour démarrer un autre thread, ou implicitement, par exemple en la remplaçant sur la stack). Utilisez l’option n ° 1.

Pour obtenir vos données, au début de votre sujet, faites

 struct data *info = (struct data*)arguments; 

Ensuite, accédez aux info comme d’habitude. Assurez-vous de le free lorsque le thread est terminé (ou, si je préfère, que l’appelant le libère après avoir rejoint le thread).

Créez un pointeur sur une structure comme vous le faites dans le premier cas ci-dessus:

 //create a pointer to a struct of type data and allocate memory to it struct data *info info = malloc(sizeof(struct data)); //set its fields info->palabra = ...; info->directoro = ...; //call pthread_create casting the struct to a `void *` pthread_create ( &thread_id[i], NULL, &hilos_hijos, (void *)data); 

1) vous devez utiliser malloc et ne pas définir comme ci-dessous

 struct data *info; info = (struct data *)malloc(sizeof(struct data)); 

et passez le pointeur de la structure dans l’appel ptherad comme ci-dessous

 pthread_create ( &thread_id[i], NULL, &thread_fn, (void *)info ); 

2) vous pouvez y accéder dans la fonction de fil comme ci-dessous

 void thread_function ( void *arguments){ struct data *info = (struct data *)arguments; info->.... }