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?
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
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. –
Sie haben den Semaphor nicht initialisiert. –