Passer plus d’un paramètre à pthread_create

Dupliquer possible:
Plusieurs arguments à la fonction appelée par pthread_create ()?
Comment passer plus d’une valeur en tant qu’argument à un thread en C?

J’ai ces structures:

struct Request { char buf[MAXLENREQ]; char inf[MAXLENREQ]; /* buffer per richiesta INF */ int lenreq; uint16_t port; /* porta server */ struct in_addr serveraddr; /* ip server sockaddr_in */ char path[MAXLENPATH]; /*struct Range range;*/ }; struct RequestGet { char buf[MAXLENREQ]; int maxconnect; struct Range range; }; struct ResponseGet{ char buf[MAXLENDATA]; //int LenRange; int expire; char dati[MAXLENDATA]; struct Range range; }; 

Comment puis-je les transmettre à pthread_create ? Peu importe la signification de chaque champ de structure.

 pthread_create(&id,NULL,thread_func,????HERE????); 

Vous ne pouvez transmettre qu’un paramètre, vous devez donc généralement créer une fonction prenant un paramètre, même si elle ne fait que renvoyer certains autres appels. Vous pouvez le faire en créant une struct et en struct la fonction de prendre un pointeur sur une telle struct .

Un exemple de base pour illustrer ce point est présenté ci-dessous. S’il vous plaît noter que ce n’est pas un exemple complet, et ne devrait pas être utilisé tel quel! Notez, par exemple, qu’aucune mémoire allouée avec malloc() n’est libérée.

 struct RequestWrapper { struct Request *request; struct RequestGet *request_get; struct ResponseGet *response_get; }; void thread_func(struct RequestWrapper *rw) { // function body here } int main(int argc, char *argv[]) { struct Request *request = malloc(sizeof(*request)); struct RequestGet *request_get = malloc(sizeof(*request_get)); struct ResponseGet *response_get = malloc(sizeof(*response_get)); ... struct RequestWrapper *wrapper = malloc(sizeof(*wrapper)); wrapper->request = request; wrapper->request_get = request_get; wrapper->response_get = response_get; ... pthread_create(&id, NULL, thread_func, &wrapper); ... } 
 struct Foo { // anything you want }; void run (void * _arg) { Foo * arg = (Foo*) _arg; // ... } int main () { pthread_t thread; Foo * foo = create_argument (); pthread_create (&thread, NULL, run, foo); } 

Cela dépend, bien sûr, du fait qu’un contrat en run verra toujours atsortingbuer un Foo* dans le dernier argument de pthread_create .

Le dernier argument de pthread_create() est un pointeur vide. Sa désignation est que vous pouvez le laisser pointer sur n’importe quel type de variable, struct, etc. Votre thread_func sait comment le gérer et peut le restituer à son type d’origine.

Placez leurs adresses dans une struct et passez un pointeur sur cette struct comme dernier argument de pthread_create() .

vous pouvez simplement créer une structure pour toutes les données et transmettre l’adresse de la structure. vous devrez peut-être mettre la structure dans le tas et la libérer une fois terminé.