Je travaille sur ce problème: prendre une lettre et le nom des mêmes fichiers à partir de la ligne de commande, compter l'occurrence du char dans chaque fichier, en utilisant un thread par fichier, et imprime le nombre total d'occurrences.Compte le char dans le fichier en utilisant thread et mutex
Ceci est mon code:
typedef struct _CharFile{
char c;
char *fileName;
} CharFile;
pthread_mutex_t count = PTHREAD_MUTEX_INITIALIZER;
int sum = 0;
void *CountFile(void *threadarg);
int main(int argc, const char * argv[]) {
pthread_t threads[argc-2];
int chck, t;
CharFile cf;
for (t=0 ; t<argc-2 ; t++){
cf.c = argv[1][0];
cf.fileName = (char *)argv[t + 2];
chck = pthread_create(&threads[t], NULL, CountFile, (void *) &cf);
if (chck){
printf("ERROR; return code from pthread_create() is %d\n", chck);
exit(-1);
}
}
printf("%lld occurrences of the letter %c in %lld threads\n", (long long)sum, argv[1][0], (long long)argc-2);
return 0;
}
void *CountFile(void *threadarg){
FILE *in;
CharFile *cf;
char c;
int counter = 0;
cf = (CharFile *) threadarg;
in = fopen(cf->fileName, "r");
if (in == NULL){
perror("Error opening the file!\n");
pthread_exit(NULL);
}
while (fscanf(in, "%c", &c) != EOF){
if(c == cf->c){
counter += 1;
}
}
fclose(in);
pthread_mutex_lock(&count);
sum += counter;
pthread_mutex_unlock(&count);
pthread_exit(NULL);
}
Je ne reçois pas d'erreur dans l'ouverture de fichier ou dans les créations de fil, mais ma sortie est toujours 0 comme occurrences au total. J'ai également essayé d'imprimer le counter
dans les threads et j'ai eu à chaque fois les mêmes nombres dans tous les threads, même si mes fichiers d'entrée sont différents. Est-ce que j'utilise mal le mutex ou y at-il autre chose qui ne va pas?
C'est l'une de mes sorties:
61 occurrences of e in this thread
0 occurrences of the letter e in 3 threads
61 occurrences of e in this thread
61 occurrences of e in this thread
Program ended with exit code: 9
Vous n'attendez pas la fin de vos discussions. –
Comment puis-je faire cela? –
Cependant, vous voulez. La façon la plus courante est d'utiliser 'pthread_join'. Mais c'est simple et celui que vous devriez probablement apprendre en premier. –