pthread_t指针作为pthread_create的参数

时间:2012-12-19 16:00:49

标签: c pointers pthreads

pthread_create的第一个参数是pthread_t指针。在下面的 hello程序中,如果第一个参数是指向pthread_t(pthread_t*)而不是pthread_t(pthread_t)的指针,则程序以Segmentation fault结束。 .. 为什么?

我不记得pthread_t*pthread_create的第一个参数的声明类型。
Butenhof的书使用POSIX线程编程的第2章说:

  

要创建线程,您必须声明类型为pthread_t [not pthread_t*]的变量。

但是according to the specification pthread_create的第一个参数是指向pthread_t的指针,为什么分段错误?


<小时/> 分段错误

pthread_t* thr;
pthread_create(thr, NULL, &hello, NULL);


<小时/> 运行正常

pthread_t thr;
pthread_t* pntr = &thr;
pthread_create(pntr, NULL, &hello, NULL);


<小时/> 你好程序:

#include <pthread.h>
#include <stdio.h>

void * 
hello(void *arg){
  printf("Hello\n");
  pthread_exit(NULL);
}

int 
main(int argc, char **argv){
  pthread_t thr = 1;
  pthread_create(&thr, NULL, &hello, NULL);



  pthread_join(thr, NULL);

  return 0;
}

pthread_create prototype:

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

3 个答案:

答案 0 :(得分:6)

pthread_t* thr;
pthread_create(thr, NULL, &hello, NULL);

声明指向pthread_t的指针,而不为其分配存储空间。当您致电pthread_create时,它会尝试写信*thr。这是一个未定义的位置,几乎肯定会失败。

pthread_t thr;
pthread_t* pntr = &thr;
pthread_create(pntr, NULL, &hello, NULL);

有效,因为您已为thr声明了存储空间(pthread_t)。

请注意,第二个工作版本可以简化为hello程序中使用的版本

pthread_t thr;
pthread_create(&thr, NULL, &hello, NULL);

...在堆栈上声明pthread_t然后将指针传递给pthread_create

答案 1 :(得分:3)

这是因为如果你只是声明一个指针,你就不能指望它指向已分配的初始化内存。

当您改为声明pthread_t时,会为其分配自己的小内存块,然后您可以使用&运算符获取地址并将其传递给pthread_create

答案 2 :(得分:0)

如果您想创建一些线程,可以使用以下代码:

pthread_t* thread_handles;
thread_handles = malloc(thread_count * sizeof(pthread_t));
for (thread = 0; thread < thread_count; thread++)
{
  pthread_create(&thread_handles[thread], NULL, threadFunc, (void*)input);
}

这样你就应该在调用pthread_create之前为你的句柄分配内存,就像你想要创建一些“struct”一样,你应该首先为它们分配内存。