#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <math.h>#include <string.h>#include <time.h>#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);}