pthread_join导致分段错误(简单程序)

时间:2013-04-18 13:06:22

标签: c multithreading segmentation-fault pthreads pthread-join

我只是尝试使用多线程程序,但是我遇到了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;
}

2 个答案:

答案 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);
//                        ^^^^^^^