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 に答える