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); ".