2012-01-23 63 views
2

可能重复:
Multiple arguments to function called by pthread_create()?
How to pass more than one value as an argument to a thread in C?传递多个参数,以在pthread_create

我有这些结构:

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 ?不管每个结构领域的意义如何。

​​
+0

我已经看到了,但我的疑问是关于三种不同结构的malloc的... – rschirin

+0

的可能重复[多参数功能通过在pthread_create()调用?(http://stackoverflow.com /(问题/ 1352749 /),[pthreads和C++](http://stackoverflow.com/questions/2468113/),[将多个参数传递给C(pthread_create)中的一个线程](http://stackoverflow.com/questions/6524433 /) – outis

回答

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); 
    ... 
} 
+0

危险不完整。看到我的评论来爆裂。 –

+0

@R ..这个想法是让他开始了他不明白的概念,而不是写一大堆其他的代码。毫无疑问,最好的例子是那些按原样运行的例子,但是这个想法让我们知道如何传递多种东西,我认为它恰当地传达了这一点。然而,我会添加一个注释,指出它的不完整性。 –

+0

那么问题是,你“让他开始”的代码可能会工作99%的时间和崩溃或其他1%的时间可怕地损坏内存。初学者不太可能意识到这一点,更不知道如何回去修复它。 –

0

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

0

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

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的合同。

+1

此答案危险地不完整;正如所写的,'foo'的生命周期可能在'run'能够使用它之前结束。你必须为'foo'分配'malloo'的空间(并且在新线程中释放'free',而不是父线程!),或者使用一些同步对象(barrier或信号量最简单)来确保'foo''他的一生不会很快结束。 –

+0

好点,编辑。 – spraff

0

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