我只是尝试使用多线程程序,但是我遇到了pthread_join函数的问题。下面的代码只是一个我用来显示pthread_join崩溃的简单程序。此代码的输出将为:
before create
child thread
after create
Segmentation fault (core dumped)
是什么原因导致pthread_join产生分段错误?
#include <pthread.h>
#include <stdio.h>
void * dostuff() {
printf("child thread\n");
return NULL;
}
int main() {
pthread_t p1;
printf("before create\n");
pthread_create(&p1, NULL, dostuff(), NULL);
printf("after create\n");
pthread_join(p1, NULL);
printf("joined\n");
return 0;
}
答案 0 :(得分:6)
因为在您致电pthread_create
时,您实际上调用该函数,并且当它返回NULL
pthread_create
时将失败。这将无法正确初始化p1
,因此(可能)会导致pthread_join
调用中出现未定义的行为。
要解决此问题,请将函数指针传递给pthread_create
调用,不要调用它:
pthread_create(&p1, NULL, dostuff, NULL);
/* No parantehsis --------^^^^^^^ */
这也应该教你检查函数调用的返回值,因为pthread_create
在失败时会返回非零值。
答案 1 :(得分:5)
您需要修改功能类型以及调用pthread_create
的方式:
void * dostuff(void *) { /* ... */ }
// ^^^^^^
pthread_create(&p1, NULL, dostuff, NULL);
// ^^^^^^^