当我尝试运行此代码时,我收到了分段错误(核心转储)的错误消息。 注意:这是一个非常长的程序(差不多600行)所以我只发布了我认为'相关的那些。如果需要,请告诉我?在此先感谢:)
#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 */
}
答案 0 :(得分:3)
如果您要将常量转换为void *
并将其作为上下文参数传递,则需要在另一端执行补充操作:
int num = (intptr_t)param;
应该为你做。你当前的程序有一个额外的解引用,最终会做这样的事情:
int num = *(int *)4;
这就是你现在正在崩溃的程序。
答案 1 :(得分:2)
您正在做的是:
check = pthread_create( &tid[i], NULL, tFunction,
的 (void *) 4
强> );
将第四个论点视为int *
,显然不是。当您在tFunction
中取消引用地址4 时,会出现段错误。
如果要将指针传递给值为4的int
,请传递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
会很有用,这样您就可以在退出程序之前等待线程终止。
EDIT2 :如果你还没有阅读评论:你应该确保如果你传递一个局部变量(就像这个例子那样,这意味着要对他的代码进行非常小的改动以获得它工作)任何新线程在变量超出范围之前使用pthread_join
完成,或者为堆上的变量动态分配内存。