2011-10-26 22 views
4

当我尝试运行此代码时,收到了Segmentation fault(核心转储)错误消息。 注意:这是一个非常长的程序(近600行),所以我只发布了我认为是相关的。让我知道是否还需要?感谢提前:)使用pthread_create()的参数4发生Seg故障

#define CONSTANT 4 

int main() 
{ 
    pthread_t tid[CONSTANT]; 
    int i, check; 
    for(i = 0; i < CONSTANT; i++) 
    { 
    check = pthread_create(&tid[i], NULL, tFunction, (void *) CONSTANT); 
    } 
} 

void * tFunction (void * param) 
{ 
    int num = * (int *) param; /* Seg fault line */ 
} 

回答

2

你在做什么是:

check = pthread_create(&tid[i], NULL, tFunction,(void *) 4);

和治疗第四个参数作为int *,它显然不是。当您取消的地址4tFunction中时,您将收到段错误。

如果你想传递一个指向int为4的值,传递一个int变量的地址,即:

#include <pthread.h> 

#define CONSTANT 4 

void * tFunction (void * param) 
{ 
    int num = * (int *) param; /* Seg fault line */ 
} 

int main(void) 
{ 
    int arg = CONSTANT; 
    pthread_t tid[CONSTANT]; 
    int i, check; 
    for(i = 0; i < CONSTANT; i++) 
    { 
    check = pthread_create(&tid[i], NULL, tFunction, (void *) &arg); 
    } 

    return 0; 
} 

编辑pthread_join将是有用的,这样你可以在退出程序之前等待您的线程终止。如果你还没有阅读评论:你应该确保如果你传递一个局部变量(就像这个例子是为了让他的代码显示一个非常小的改变来实现它)那样任何新线程在变量超出范围之前使用pthread_join完成,或者为堆上的变量动态分配内存。

+3

被警告说,传递一个指向局部变量的指针是潜在的危险,这取决于调用函数的生命周期。 –

+0

是的,只是在这个例子中,它没有任何区别。 – AusCBloke

+0

哦,是啊!那就是我在做的事情:)我玩了一圈,忘了在代码中改回它。无论如何,这给了我一个错误:左值需要作为一元操作数。有任何想法吗? – Dino55

3

如果你要投一个常数void *并把它作为你的环境参数,你需要做的另一端互补操作:

int num = (intptr_t)param; 

应该为你做。您当前的程序有一个额外的解除引用,最终做这样的事情:

int num = *(int *)4; 

这就是现在崩溃您的程序。

+0

警告:从指针转换为不同大小的整数。是我从中得到的。我怎样才能摆脱警告? – Dino55

+0

@ Dino55 - 'int'与您平台上的指针大小不一样。我用'stdint.h'中的C99'intptr_t'类型更新了我的答案。如果这不起作用,你可以使用'long'。 –

+0

谢谢你的帮助:) – Dino55