带有pthread_create()参数4的Seg Fault

时间:2011-10-26 20:34:25

标签: c pthreads

当我尝试运行此代码时,我收到了分段错误(核心转储)的错误消息。 注意:这是一个非常长的程序(差不多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 */
}

2 个答案:

答案 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完成,或者为堆上的变量动态分配内存。