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;
}