pthread_create()的第4个参数导致了"段错误"。

4
当我尝试运行这段代码时,出现了“分段错误(core dump)”的错误信息。 注意:这是一个非常长的程序(近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个回答

3

如果你要将一个常量转换为void *并将其作为上下文参数传递,那么你需要在另一端进行相应的操作:

int num = (intptr_t)param;

应该可以为您完成。您当前的程序存在额外的解引用,最终会执行类似于这样的操作:

int num = *(int *)4;

这就是导致你的程序崩溃的原因。


警告:从不同大小的指针转换为整数。这是我得到的信息。我该如何消除这个警告? - Dino55
@Dino55 - 在你的平台上,int 的大小与指针不同。我已经在我的答案中更新了来自 stdint.h 的 C99 intptr_t 类型。如果这不起作用,你可以使用 long - Carl Norum

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是有用的,因为它可以让你在退出程序之前等待线程终止。

编辑2: 如果您还没有阅读评论: 您应该确保如果您传递一个局部变量(如此示例旨在展示对代码进行非常小的更改以使其工作), 则使用pthread_join来确保任何新线程在变量超出范围之前完成,或者在堆上分配内存以动态地分配变量。


3
请注意,将指向本地变量的指针传递给其他函数可能会存在潜在风险,这取决于调用函数的生命周期。 - Carl Norum
是的,没错,在这个例子中并没有什么区别。 - AusCBloke
@Dino55,只要包含<pthread.h>头文件,它应该可以直接编译:gcc -pthread -o ... - AusCBloke
@AusCBloke,哦。抱歉!我读你的回复太快了,没有看到你实际上将常量保存在本地变量中 >.< 太好了!这个总共节省了我的程序 :) 非常感谢你们!! - Dino55
哎呀,我说的是 pthread_join。你可以使用 pthread_exit(NULL) 或者 return NULL,两者差别不大,由你决定。我通常使用 return NULL - AusCBloke
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接