将多个参数传递给pthread_create

时间:2012-01-23 18:07:31

标签: c multithreading parameters pthreads

  

可能重复:
  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????);

5 个答案:

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

当然,这取决于runFoo*的最后一个参数中始终会pthread_create的合同。

答案 2 :(得分:0)

pthread_create()的最后一个参数是一个void指针。它的名称是你可以让它指向任何类型的变量,结构等。你的thread_func知道如何处理它并可以将其转换回原始类型。

答案 3 :(得分:0)

将他们的地址放入struct,并将指向struct的指针作为pthread_create()的最后一个参数传递。

答案 4 :(得分:0)

您可以为所有数据创建一个结构并传递结构的地址。您可能需要将结构放入堆中并在完成后释放它。