我是C语言中的pthread的新手,我正在编写一个简单的程序,该程序可以在多个文件中并行查找单词。但是,每当我输入多个文件时,输出都会变化,这表明我的代码中存在无法解决的竞争条件。你能帮我解决吗?

下面的代码片段主要存在于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
打印的结果与随后调用的同一呼叫不同。但是请注意,仅传递一个文件时,该程序才能运行。

任何帮助表示赞赏。

最佳答案

strtok保留一个全局的内部指针...使用strtok_r

关于c - C中带有pthread的竞争条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10549816/

10-11 16:18