2013-11-03 43 views
1

我想创建n个线程。然后向它们传递一个结构体以用数据填充该结构体;例如bool来跟踪线程是否完成或被终止信号中断。创建线程并将结构传递给它

n = 5; // For testing. 

pthread_t threads[n]; 
for(i=0; i<n; i++) 
    pthread_create(&threads[i], &thread_structs[i], &functionX); 

假设thread_structs已经配对了。

functionX()注意功能没有参数。我应该为结构创建一个参数吗?或者我传递的结构是好的?

我该如何指向刚刚传递给函数的结构?

+0

为什么你会传递它作为void而不是结构类型? –

+0

“void *”是泛型指针类型 - 所有指针可衰减为“void *”,而不会出现转换错误。这允许pthread_create的通用定义,而不必知道定制/未来类型。如果它被定义为一个'thread_struct *'并且你想传递一个指向int的指针,那么你就必须进行一次强制转换。 – kfsone

+1

或者更简单的说法:取一个void *是一种说法,它会指向任何东西。不利的一面是,它实际上是以void *的形式到达的,而您必须将其重新放回到界面的一侧。这应该提醒你“这可能是一个指向任何东西,要小心” – kfsone

回答

5

这不是你如何使用在pthread_create:

http://man7.org/linux/man-pages/man3/pthread_create.3.html

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
         void *(*start_routine) (void *), void *arg); 

的第三个参数是你的例行公事,第四是将被转发到你的常规参数。你的程序应该是这样的:

void* functionX(void* voidArg) 
{ 
    thread_struct* arg = (thread_struct*)voidArg; 
    ... 

和并行线程调用应该是:

pthread_create(&threads[i], NULL, functionX, &thread_structs[i]); 

(除非你有一个pthread_attr_t供应作为第二个参数)。

+0

我不应该通过&thread_structs [i]? –

+0

确实 - 修正了。得到了一点点捣乱在该死的kindle上键入非alphanum符号:) – kfsone

+0

我决定添加另一个参数到functionX。编译器会抛出“太多的参数到函数'pthread_create'。除了把所有参数放到我的结构体中,我可以通过尽可能多的参数来解决这个问题吗? –

2

申报functionX

void* function functionX(void* data) { 
} 

再投data到任何指针类型的&thread_structs[i]是,把它作为你请。

+0

谢谢你。 –