Skalarprodukt mit Pthread Mutex-Variable



  • Hallo,
    habe folgende Aufgabenstellung:

    Programmieren Sie die Bildung des Skalarprodukts mit 2 Threads. Schützen Sie den Zugriff auf die Variable sum dabei durch einen geschützten Bereich, der durch die Verwendung einer Pthread Mutex-Variable realisiert wird.

    Ich kriege in Zeile 71,72 bzw. 87, 88 einen Fehler (es ist eigentlich nur ein Fehler der sich 4 mal wiederholt), aber ich komm nicht drauf warum.
    Und wegen der Mutex-Variable gibts auch einen Fehler beim Compiler. Ansonsten müsste es passen.
    Die einzige Vorgabe waren die 2 for-Schleifen in den beiden Threads.

    Kennt sich da jemand aus?

    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    
    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
    
    int sum;
    
    typedef struct Vektor
    {
     int* Values;
     int dim;      
    }VEKTOR;
    
    typedef struct ZweiVektoren
    {
    VEKTOR A;
    VEKTOR B;
    }ZWEIVEKTOREN;
    
    void FillVektor(VEKTOR* V)
    {
    int i=0;
     for (i = 0; i < V->dim; ++i) V->Values[i] = 1;
    }    
    
    VEKTOR* initVektor(int dim)
    {
            VEKTOR *V;
    
            V = malloc(sizeof(VEKTOR));
    
            V->dim = dim;
    
            if (!V) exit(-1);
            V->Values=(int*) malloc(sizeof(int)*dim);        
            if (!V->Values) exit(-1);
    
            int i=0;
            for (i = 0; i < dim; ++i)
            {        
            V->Values[i]=0;
            } 
    
            return V;
    }
    
    void PrintVektor(VEKTOR* V)
    {
     int dim= V->dim;
     int i;
     for(i=0; i<dim;++i)
     {
        printf("%d ", V->Values[i]);
     }
        printf("\n");
    }
    
    void FreeVektor(VEKTOR* V)
    {
    free(V->Values);
    free(V);         
    }
    
    void *LoopOne(void *Arg) 
    { 
       ZWEIVEKTOREN AB =*((ZWEIVEKTOREN *) Arg); 
    
       VEKTOR *A = *AB->A;
       VEKTOR *B = *AB->B;
       int i;
    
       pthread_mutex_lock(&mutex);	
       for (i=0;i<A->dim/2;i++)
    	sum += A->Values[i]*B->Values[i];
        pthread_mutex_unlock(&mutex);
    
        return NULL; 
    } 
    
    void *LoopTwo(void *Arg) 
    { 
       ZWEIVEKTOREN AB =*((ZWEIVEKTOREN *) Arg); 
    
       VEKTOR *A = *AB->*A;
       VEKTOR *B = *AB->*B;
       int i;
    
       for (i=A->dim/2 + 1;i<A->dim;i++)
    	sum += A->Values[i]*B->Values[i];
    
        return NULL;  
    } 
    
    int main(int argc, char *argv[])
    {
    int Size=atoi(argv[1]);
    if(Size <0)
    {
     printf("Grösse kleiner 0");
     exit(-1);       
    }
    
    printf("Groesse:\n");
    printf("%d ",Size);
    printf("\n");
    
    VEKTOR* A=initVektor(Size);
    printf("Vektor A:\n");
    FillVektor(A);
    PrintVektor(A);
    
    VEKTOR* B=initVektor(Size);
    printf("Vektor B:\n");
    FillVektor(B);
    PrintVektor(B);
    
    ZWEIVEKTOREN* AB; 
    AB->A = *A;
    AB->B = *B;
    
    pthread_t ThreadOne;
    pthread_t ThreadTwo;
    
    pthread_create(&ThreadOne, NULL, LoopOne, &AB); 
    pthread_create(&ThreadTwo, NULL, LoopTwo, &AB); 
    
    pthread_join(LoopOne, NULL); 
    pthread_join(LoopTwo, NULL);
    
    printf("Das Skalarprodukt ist %d\n", sum);
    
    /*FreeVektor(A);
    FreeVektor(B);*/
    
      return 0;
    }
    

    mfg



  • AB ist doch schon ein Zeiger, also weg mit dem & in ", &AB); ".


Anmelden zum Antworten