#include #include #include #include #include #include #define BUF 255 #define MAX_X 1024 /*Zählvariable für Threads*/ int counter = 0; int counter2 = 0; /*Mutex wird initialisiert*/ pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; /*Struktur für die Werte aus Datei und Berechnung*/ typedef struct { long a; long n; long x[MAX_X]; long erg[MAX_X]; long sum; }data_t; data_t input; void *multi(void *arg); void *add(void *arg); /*Thread-Funktion für Multiplikation*/ void *multi(void *arg) { int status; /*Daten werden gelockt*/ status = pthread_mutex_lock(&mutex); if (status != 0) { fprintf (stdout, "Fehler bei lock in Thread:%ld\n",pthread_self()); exit (EXIT_FAILURE); } /*Berechnung wird durchgeführt für jedes x und in Struct zwischengespeichert*/ input.erg[counter] = input.a * input.x[counter]; counter++; /*Daten werden unlocked*/ status = pthread_mutex_unlock(&mutex); if (status != 0) { fprintf (stdout, "Error on mutex_unlock with Thread%ld\n", pthread_self()); exit (EXIT_FAILURE); } /*Thread wird beendet*/ pthread_exit ((void *) 0); } /*Thread-Funktion für Addition*/ void *add(void *arg) { int status; /*Daten werden gelockt*/ status = pthread_mutex_lock(&mutex); if (status != 0) { fprintf (stdout, "Fehler bei lock in Thread:%ld\n",pthread_self()); exit (EXIT_FAILURE); } /*Berechnung*/ input.sum += input.erg[counter2]; counter2++; status = pthread_mutex_unlock(&mutex); if (status != 0) { fprintf (stdout, "Error on mutex_unlock with Thread%ld\n", pthread_self()); exit (EXIT_FAILURE); } /*Daten werden entlocked*/ pthread_exit ((void *) 0); } /*Funktion zum starten der Threads*/ int thread_start() { pthread_t th[input.n]; int i; fprintf(stdout, "Threads for Multi started\n"); for (i = 0; i < input.n; i++) { /*Thread wird n mal gestartet um x mit a zu multiplizieren*/ if(pthread_create(&th[i], NULL, &multi, NULL) != 0) { fprintf (stderr, "Error creating Thread %d ...\n",i+1); return EXIT_FAILURE; } } /*Es wird für jeden Thread gewartet bis er beendet hat*/ for( i=0; i < input.n; i++) { pthread_join(th[i], NULL); } fprintf(stdout, "Threads for Multi ended\n"); fprintf(stdout, "Threads for Add started\n"); for (i = 0; i < input.n; i++) { if(pthread_create(&th[i], NULL, &add, NULL) != 0) { fprintf (stderr, "Error creating Thread %d ...!\n", i+2); return EXIT_FAILURE; } } for( i=0; i < input.n; i++) { pthread_join(th[i], NULL); } fprintf(stdout, "Threads for Add ended\n"); return (0); } int main (int argc, char *argv[]) { FILE *fp; char *token = NULL; char delim[] = " "; char string[BUF]; int i=0; long temp; clock_t start, stop; start=clock(); input.sum = 0; /*Aufruf überprüfen*/ if(argc < 2) { fprintf(stderr, "Usage: %s file\n", argv[0]); return (EXIT_FAILURE); } /*Datei zum lesen öffnen*/ if( (fp = fopen(argv[1], "r") ) == NULL) { fprintf(stderr, "%s: File '%s' couldn't be opened!\n", argv[0], argv[1]); return (EXIT_FAILURE); } /* a und n aus erster Zeile lesen*/ if( fgets(string, BUF, fp) != NULL) { token = strtok(string, delim); input.a = strtol(token, NULL, 10); if( (token = strtok(NULL, delim)) == NULL) { fprintf(stderr, "Wrong fileformat\n"); return EXIT_FAILURE; } input.n = strtol(token, NULL, 10); } if(input.n > 1024) { fprintf(stderr, "Maximum for n is 1024!\n"); return EXIT_FAILURE; } /* x ins array einlesen*/ while(fgets(string, BUF, fp) != NULL) { temp = strtol(string, NULL, 10); input.x[i] = temp; i++; } /* sollte es zu wenig x geben wird abgebrochen*/ if (i < input.n) { fprintf(stderr, "%s: Not enough entries for x in file!", argv[0]); return EXIT_FAILURE; } /* Funktion für die Threads wird aufgerufen*/ thread_start(); stop = clock(); /*Ausgabe*/ fprintf(stdout, "***************************\n"); fprintf(stdout, "E = a*xi ( i = 1 -> n)\n"); fprintf(stdout, "a = %ld, n = %ld\n", input.a, input.n); fprintf(stdout, "Result: %ld\n", input.sum); fprintf(stdout, "Time needed : %lf\n", (float)(stop - start) / CLOCKS_PER_SEC); fprintf(stdout, "***************************\n"); fclose(fp); return (0); }