All pastes #11925 Raw Edit

Anonymous

public c v1 · immutable
#11925 ·published 2005-05-16 20:24 UTC
rendered paste body
#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);  }