pthread_create的第一个参数是pthread_t指针。在下面的 hello程序中,如果第一个参数是指向pthread_t(pthread_t*
)而不是pthread_t(pthread_t
)的指针,则程序以Segmentation fault
结束。 .. 为什么?
我不记得pthread_t*
是pthread_create
的第一个参数的声明类型。
Butenhof的书使用POSIX线程编程的第2章说:
要创建线程,您必须声明类型为
pthread_t
[notpthread_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);
答案 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”一样,你应该首先为它们分配内存。