私は C で pthreads を初めて使用し、複数のファイル内の単語を並行して検索する単純なプログラムを作成しています。ただし、複数のファイルを入力するたびに出力が変化し、コードで修正していない競合状態があることを示唆しています。修正を手伝っていただけますか?
次のスニペットはメインで、pthreads を作成します。
int i = 0;
char *word = "Pluto"; //Word to be found
Message messages[argc-1];
pthread_t threads[argc-1];
for(i; i < argc - 1; i++){
messages[i].file = argv[i + 1];
messages[i].word = word;
messages[i].fp = fopen(argv[i + 1], "r");
int iret = pthread_create( &threads[i], NULL, threadFindWord, (void*) &(messages[i]));
}for(i = 0; i < argc - 1; i++){
pthread_join(threads[i],NULL);
}
各スレッドが呼び出す関数:
Message *msg;
msg = (Message *) ptr;
int numFound = ffindWord(msg->fp, msg->word);
printf("File %s has %i occurences of the word %s\n", msg->file, numFound, msg->word);
fclose(msg->fp);
pthread_exit(NULL);
以下は、ファイル内の単語を検索するためのコードです)
int findWord(char * file, char * word){
char * current = strtok(file, " ,.\n");
int sum = 0;
while (current != NULL){
//printf("%s\n", current);
if(strcmp(current, word) == 0)
sum+=1;
current = strtok(NULL, " ,.\n");
}
return sum;
}
int ffindWord(FILE *fp, char *word){
fseek(fp, 0, SEEK_END);
long pos = ftell(fp);
fseek(fp, 0, SEEK_SET);
char *bytes = malloc(pos);
fread(bytes, pos, 1, fp);
bytes[pos-1] = '\0';
int sum = findWord(bytes, word);
free(bytes);
return sum;
}
明確にするために、問題は、プログラムを連続して実行すると異なる結果が得られることです。呼び出し $programname file1 file2 は、直後に呼び出された同じ呼び出しとは異なる結果を出力します。ただし、プログラムは 1 つのファイルのみが渡された場合に機能することに注意してください。
どんな助けでも大歓迎です。