2017-03-21 5 views
-2

Die Idee hier ist es, eine Datei zu erstellen, in die geschrieben werden soll. Ich versuche zehn Threads zu erstellen und lasse sie zehn Mal in die Datei drucken. Verwenden eines Semaphors, um zu verhindern, dass mehrere Threads gleichzeitig in die Datei schreiben. Aber ich habe Fehler. Der Code ist unten:In Datei mit 20 Threads schreiben

#include <stdio.h> 
#include <sys/types.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <pthread.h> 
#include <semaphore.h> 

#define FNAME "fisier.txt" 
#define MAX_STRING_LEN 80 
#define NUMBER_OF_THREADS 10 

FILE *fp; 
sem_t mutex; 
int counter; 

FILE *makeTextFile(char *fname, char mode){ 
    FILE *localFP; 
    localFP = fopen(fname, &mode); 
return (localFP); 
} 

void *print_message(void *tid){ 
    int i; 
    for (i = 0; i < 10; i++){ 
     sem_wait(&mutex); 
     fp = fopen(FNAME, "a"); 
     fprintf(fp, "Thread %d is running.\n", tid); 
     fclose(fp); 
    sem_post(&mutex); 
    printf ("Thread %d has finished.\n", tid); 
    } 
} 

int threads(){ 
    const char *fName = "fisier.txt"; 
    int status; 
    pthread_t threads[NUMBER_OF_THREADS]; 
    fp = makeTextFile(FNAME, 'w'); 
    fprintf(fp, "Process ID: %ld\n", (long)getpid()); 
    fclose(fp); 

    int i; 
    for (i =0; i < NUMBER_OF_THREADS; i++){ 
     status = pthread_create(&threads[i], NULL, &print_message, (void *)i); 
     if (status != 0){ 
      printf("pthread_create returned error code %d\n", status); 
      exit(-1); 
     } 
    } 
    } 

int main() { 
    threads(); 

    return 0; 
} 

Warnungen:

probl2.c: In function ‘print_message’: 
probl2.c:27:21: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘void *’ [-Wformat=] 
     fprintf(fp, "Thread %d is running.\n", tid); 
        ^
probl2.c:30:14: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘void *’ [-Wformat=] 
    printf ("Thread %d has finished.\n", tid); 
      ^
probl2.c: In function ‘threads’: 
probl2.c:44:68: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 
    status = pthread_create(&threads[i], NULL, &print_message, (void *)i); 

Schreiben in eine Datei nur es: Prozess-ID: 10568 Ich möchte schreiben, wie es zu lösen?

+1

Wirf das 'void *' in ein 'int', da du schlau genug warst, das' int' in ein 'void *' zu verwandeln. Und das sind keine Fehler, sondern Warnungen. Trotzdem, gut, dass du ihnen gehorcht hast. – StoryTeller

+0

Die letzte Warnung kann vermieden werden, indem man von '' ... so '(void *) (intptr_t) i 'und' (int) (intptr_t) tid' auf 'intptr_t' wirft. Es ist ein bisschen ungeschickt, aber es ist eine Möglichkeit, die Warnung loszuwerden, ohne die Warnung zu deaktivieren. –

+1

Sie haben den Semaphor nicht initialisiert. –

Antwort

1

Ein paar Dinge, die ich bemerkt:

Sie nicht Ihre Semaphore initialisiert. Verwenden Sie dazu sem_init (und verwenden Sie sem_destroy, wenn Sie fertig sind).

Sie sind nicht an Ihren Threads teilnehmen. Das Programm wird beendet, ohne auf die Beendigung der Threads zu warten. Sie können pthread_join in einer Schleife verwenden, um sicherzustellen, dass alle Threads beendet sind.

Hier ist eine aktualisierte Version Ihrer Threads-Funktion. Im Produktionscode würde ich die Rückgabewerte der hinzugefügten Funktionen überprüfen.

void threads(){ 
    const char *fName = "fisier.txt"; 
    int status; 
    pthread_t threads[NUMBER_OF_THREADS]; 
    fp = makeTextFile(FNAME, 'w'); 
    fprintf(fp, "Process ID: %ld\n", (long)getpid()); 
    fclose(fp); 

    sem_init(&mutex,0,1); 
    int i; 

    for (i =0; i < NUMBER_OF_THREADS; i++){ 
     status = pthread_create(&threads[i], NULL, &print_message, (void*)i); 
     if (status != 0){ 
      printf("pthread_create returned error code %d\n", status); 
      exit(-1); 
     } 
    } 

    void* value = NULL; 
    for (i = 0; i < NUMBER_OF_THREADS; i++) { 
     pthread_join(threads[i], &value); 
    } 
    sem_destroy(&mutex); 
} 
+0

Vielen Dank, jetzt ist alles in Ordnung: D – Lau

Verwandte Themen