1

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

2 回答 2

7

因为在你调用pthread_create你实际上调用了函数,并且当它返回NULL pthread_create时会失败。这将无法正确初始化p1,因此(可能)会在pthread_join调用中导致未定义的行为。

要解决此问题,请将函数指针传递给pthread_create调用,不要调用它:

pthread_create(&p1, NULL, dostuff, NULL);
/* No parantehsis --------^^^^^^^ */

这也应该教你检查函数调用的返回值,pthread_create失败时返回非零值。

于 2013-04-18T13:08:09.110 回答
5

您需要修复函数类型和调用方式pthread_create

void * dostuff(void *) { /* ... */ }
//             ^^^^^^

pthread_create(&p1, NULL, dostuff, NULL);
//                        ^^^^^^^
于 2013-04-18T13:07:50.387 回答