2

pthreads チュートリアルの演習の一環として、10 個のスレッドを結合するのではなく、10 個のスレッドを作成するプログラムを作成しました。プログラムが実行され、出力が出力されますが、pthread_join への最初の呼び出しでセグメンテーション違反が発生したようです。なぜこれが起こっているのかわかりません。Web で検索してみましたが、関数に渡された無効なポインターに関するほとんどの問題。簡単に確認できないため、これが私のコードと同じ問題であるかどうかはわかりません。

誰かが私を助けることができれば、私は確かにそれを感謝します:)

コードは以下のとおりです。

#include <stdio.h>
#include <pthread.h>
#define NTHREADS    10

void *thread_function(void *arg)
{
    int i;
    int *coming = (int*) arg;
    for(i=0; i<5; i++)
        printf("Hello, World (thread %d)\n", *coming);
    return NULL;
}

int main(void)
{
    int i;
    void *exit_status;
    int retVal;
    pthread_t pthread_array[NTHREADS];
    int randVals[10] = {23,5,17,55,9,47,69,12,71,37};

    printf("threads are created\n");
    for(i=0; i<10; i++)
    {
        retVal=pthread_create(&pthread_array[i], NULL, thread_function, &randVals[i]);
        printf("pthread_create %d retVal=%d\n", i, retVal);
    }

    printf("threads are joined\n");
    for(i=0; i<10; i++)
    {
        retVal= pthread_join(pthread_array[i], &exit_status);
        printf("pthread_join %d retVal=%d and exit_status=%d\n", i, retVal,
        *((int *)exit_status));
    }

    printf("all threads have ended\n");
    return 0;
}
4

2 に答える 2

0

これが問題です

printf("pthread_join %d retVal=%d and exit_status=%d\n", i, retVal,
    *((int *)exit_status));

スレッド関数は NULL を返すため、これが に格納されている値ですexit_status。だから今printfあなたはこれをします

*((int *)exit_status

この NULL ポインターを int* にキャストしてから逆参照しています。NULL ポインターを逆参照することはお勧めできません。使用方法の完全な例については、この質問を参照してexit_status ください

于 2012-09-08T21:32:02.160 に答える
0
    *((int *)exit_status));

スレッド関数が NULL を返す場合 (実際にそうです)、これはそれを逆参照しようとします。そうする前に、テストする必要がありますexit_status

pthread_join(...);
if (exit_status != NULL)
    /* Safe to use. */
于 2012-09-08T21:32:08.523 に答える