Передача нескольких параметров в pthread_create

Возможный дубликат:
Несколько аргументов функции, вызванной pthread_create ()?
Как передать более одного значения в качестве аргумента в stream в C?

У меня есть такие структуры:

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; }; 

Как я могу передать их pthread_create ? Независимо от значений каждой области структур.

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

Вы можете передавать только один параметр, поэтому вам обычно нужно сделать функцию, которая принимает один параметр, даже если он просто переносит некоторые другие вызовы. Это можно сделать, создав struct и получив указатель на такую struct .

Ниже приведен базовый пример, иллюстрирующий суть. Обратите внимание, что это не полный пример, и его нельзя использовать как есть! Обратите внимание, например, что ни одна из памяти, выделенная с помощью malloc() не освобождается.

 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); } 

Это зависит, конечно, от контракта, который run , всегда будет иметь Foo* в последнем аргументе pthread_create .

Последний аргумент pthread_create() является указателем на пустоту. Его назначение состоит в том, что вы можете указать ему на любую переменную, структуру и т. Д. Ваш thread_func знает, как с ним справиться, и может вернуть его к исходному типу.

Поместите их адреса в struct и передайте указатель на эту struct в качестве последнего аргумента pthread_create() .

вы можете просто создать структуру для всех данных и передать адрес структуры. вам может понадобиться поместить структуру в кучу и освободить ее, когда закончите.