1

pthread について学んでいますが、それらを作成するのに問題があります。これが私の出力とgdb情報です:

main() でスレッド 1 を作成
エラー: スレッド 1 の pthread_create() からの戻りコードは 22 です
main() で、スレッド 2 を作成する
エラー: スレッド 2 の pthread_create() からの戻りコードは 22 です
main() でスレッド 3 を作成
エラー: スレッド 3 の pthread_create() からの戻りコードは 22 です
main() でスレッド 4 を作成
エラー: スレッド 4 の pthread_create() からの戻りコードは 22 です
main() でスレッド 5 を作成
エラー: スレッド 5 の pthread_create() からの戻りコードは 22 です

プログラム受信信号 SIGSEGV、セグメンテーション違反。0xb7fb4d8a で
pthread_join (threadid=76038327、thread_return=0x0)
    pthread_join.c:46 で 46 pthread_join.c: そのようなファイルまたはディレクトリはありません。

そして、ここに私のコードがあります:

#include <stdlib.h>
#include <stdio.h>
#include <strings.h>
#include <errno.h>
#include <pthread.h>
#include <unistd.h>

#define SBUFSIZE 1025

char errorstr[SBUFSIZE];
FILE* inputfp[5];

void* f(void* inpFile) {
    fprintf(stderr, "%s\n", (char*)inpFile);
    return NULL;
}

int main (int argc, char* argv[]) {

    int i;

    /* Thread Variables */
    pthread_attr_t attr;
    pthread_t *th[argc-2]; //one thread for each input file

    /* allocate memory for the threads */
    for (i = 0; i < (argc-2); i++) {
        th[i] = (pthread_t *) malloc(sizeof(pthread_t)); 
        inputfp[i] = fopen(argv[i], "r");
        if (!inputfp[i]) {
            sprintf(errorstr, "Error Opening Input File: %s", argv[i]);
            perror(errorstr);
        }
    }

    /* Create one thread for each input file */
    for (i = 1; i < (argc - 1); i++) {
        fprintf (stderr, "In main(), creating thread %1d\n", i);
        int rc = pthread_create (th[i], &attr, f, inputfp[i-1]);
        if (rc) {
            printf("ERROR: return code from pthread_create() is %d for thread %d\n",
                rc, i);
        }
    }

    /* wait for the threads to finish */
    for (i = 1; i < (argc - 1); i++) {
        pthread_join(*th[i], 0);
    }

    return EXIT_SUCCESS;
}

私は何かが欠けていますが、何がわかりません。誰でも助けることができますか?ありがとうございました!

編集: Joachim Pileborg からの提案に従ってコードを変更した方法を次に示します。pthread_create() からエラー 22 が返されますが、pthread_join での SIGSEGV エラーは発生しなくなりました。

pthread_create() が 0 を返すようにする (スレッドの作成が成功したことを示す) 方法について何か提案はありますか? 再度、感謝します!

int main (int argc, char* argv[]) {

    int i;

    /* Thread Variables */
    pthread_attr_t attr;
    pthread_t *th[argc-2]; //one thread for each input file

    /* allocate memory for the threads */
    for (i = 0; i < (argc-2); i++) {
        th[i] = (pthread_t *) malloc(sizeof(pthread_t)); 
        printf("%s\n", argv[i+1]);
        inputfp[i] = fopen(argv[i+1], "r");
        if (!inputfp[i]) {
            sprintf(errorstr, "Error Opening Input File: %s", argv[i]);
            perror(errorstr);
        }
    }

    /* Create one thread for each input file */
    for (i = 0; i < (argc - 2); i++) {
        fprintf (stderr, "In main(), creating thread %1d\n", i);
        int rc = pthread_create (th[i], &attr, f, inputfp[i]);
        if (rc) {
            printf("ERROR: return code from pthread_create() is %d for thread %d\n",
                rc, i);
        }
    }

    /* wait for the threads to finish */
    for (i = 0; i < (argc - 2); i++) {
        pthread_join(*th[i], 0);
    }

    return EXIT_SUCCESS;
}
4

1 に答える 1

1

ゼロから までループする 1 つのループがありargc - 3、正しいインデックス (ゼロから「配列のサイズから 1 を引いた値」まで) を使用します。

argc - 2次に、1 から にループし、1 から「配列のサイズ」までのインデックスを使用する2 つのループがあります。

3 つの場所すべてで、最初のループと同じループを使用する必要があります。

于 2013-02-23T05:13:42.217 に答える