可能重复:
Multiple arguments to function called by pthread_create()?
How to pass more than one value as an argument to a thread in 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????);
答案 0 :(得分:6)
您只能传递一个参数,因此您通常需要创建一个带有一个参数的函数,即使它只包含其他一些调用。您可以通过创建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);
...
}
答案 1 :(得分:2)
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
的合同。
答案 2 :(得分:0)
pthread_create()
的最后一个参数是一个void指针。它的名称是你可以让它指向任何类型的变量,结构等。你的thread_func
知道如何处理它并可以将其转换回原始类型。
答案 3 :(得分:0)
将他们的地址放入struct
,并将指向struct
的指针作为pthread_create()
的最后一个参数传递。
答案 4 :(得分:0)
您可以为所有数据创建一个结构并传递结构的地址。您可能需要将结构放入堆中并在完成后释放它。