pthread_t指针作为pthread_create的参数

pthread_t指针作为pthread_create的参数,c,pointers,pthreads,C,Pointers,Pthreads,pthread_create的第一个参数是pthread_t指针。在下面的hello程序中,如果第一个参数是指向pthread_t(pthread_t*)的指针,而不是pthread_t(pthread_t),则程序以分段错误结束。为什么? 我不记得将pthread\u t*视为pthread\u create的第一个参数的声明类型 Butenhof的书《用POSIX线程编程》第2章说: 要创建线程,必须声明类型为pthread\u t[非pthread\u t*]的变量 但是pthread

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

我不记得将
pthread\u t*
视为
pthread\u create
的第一个参数的声明类型
Butenhof的书《用POSIX线程编程》第2章说:

要创建线程,必须声明类型为
pthread\u t
[非
pthread\u t*
]的变量

但是
pthread\u create
的第一个参数是指向
pthread\u t
的指针,那么为什么分段错误呢



分段故障

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


运行正常



你好节目:

#包括
#包括
无效*
你好(void*arg){
printf(“Hello\n”);
pthread_exit(NULL);
}
int
主(内部argc,字符**argv){
pthread_t thr=1;
pthread_create(&thr,NULL,&hello,NULL);
pthread_join(thr,NULL);
返回0;
}

pthread_创建原型:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void*), void *arg);
声明指向
pthread\u t
的指针,但不为其分配存储。当您调用
pthread\u create
时,它将尝试写入
*thr
。这是在一个未定义的位置,几乎肯定会失败

pthread_t thr;
pthread_t* pntr = &thr;
pthread_create(pntr, NULL, &hello, NULL);
因为您已经为
pthread\u t
声明了存储(
thr
在堆栈上)

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

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

…它在堆栈上声明一个
pthread\u t
,然后将指向它的指针传递到
pthread\u create

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


相反,当您声明一个
pthread\u t
时,它会被分配一小块内存,然后您可以使用
&
操作符获取地址,并将其传递给
pthread\u create

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

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\u t*thread\u句柄;
thread_handles=malloc(thread_count*sizeof(pthread_t));
对于(线程=0;线程<线程计数;线程++)
{
pthread_创建(&thread_处理[thread],NULL,threadFunc,(void*)输入);
}

这样,您应该在调用
pthread\u create
之前为句柄分配内存,就像当您要创建一些“结构”时,您应该首先为它们分配内存一样。

Ohhh。。。这是因为
&
分配空间!我看不出这样一件蠢事。感谢第二个,有效的,版本可以简化为hello程序中的版本。哦,是的,恐怕我还没有读到那么深的问题。我会马上更新我的答案。如果没有
&
,指针将不会初始化。谢谢。
&
操作符将
pthread\u t
的地址作为
pthread\u t*
类型的指针,然后可以使用该指针调用
pthread\u create
。它不会初始化指针,而只是简单地创建一个指向分配内存区域的有效指针。也许我不清楚。初始化指针时,我的意思是获取pthread所引用的内存的地址(指向,即将
thr
的地址分配给
pntr
)。注意:就在
pthread_t*pntr=&thr
和对
pthread_create
pntr
的调用指向未分配的内存(因为thr尚未初始化)。
pntr
指向已分配的内存,因为它指向
&thr
<不过,code>thr很可能是未初始化的。我明白你的意思。然后
pntr
指向
&thr
,这又指向未分配的内存。。。rigth?请参阅中定义和声明的区别
pthread_t thr;
pthread_create(&thr, NULL, &hello, NULL);
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);
}