[Problem]pthread_create | pthread_mutex_init | Summierung von n Zahlen
-
Hi!
Ich arbeit an einem Beispiel das n Zahlen in 2 verschiedenen threads summieren soll und am Ende die Gesamtsumme ausgeben soll.#include <stdio.h> #include <time.h> #include <stdlib.h> #include <pthread.h> int sum; int left; int right; pthread_mutex_t mutex; int readSize(); void readNumbers(int *numbers, int size); int* cutArray(int array[],int half, int size); void sumUpR(int *p); void sumUpL(int *p); int main() { int *pointr = NULL; int *pointl = NULL; pthread_t p1,p2; pthread_mutex_init (&mutex, NULL); int half; int size = readSize(); left = size; int array[size]; readNumbers(array, size); half = size / 2; pointl = &array[0]; pointr = cutArray(array,half,size); //Da man dem pthread nur ein Argument übergeben kann,übergebe ich hier die // 2 Pointer die auf die jeweiligen Array mit den Werten zeigen. Nur verwirrt // sich der Pointer von der rechten Seite irgendwo?? pthread_create(&p2,NULL, sumUpL,(int*) &pointl) ; pthread_create (&p1, NULL, sumUpR,(int*) &pointr); pthread_join (p1, NULL); pthread_join (p2, NULL); printf("Die Summe beträgt: %d\n", sum); return 0; } //------------------------------------------------------------------------------ // Hier wird Anzahl der Zahlen eingelesen und zurück gegeben. int readSize() { int size = 0; printf("Bitte geben Sie an, wie viele Zahlen sie eingeben möchten: "); scanf("%d", &size); return size; } //------------------------------------------------------------------------------ // Die Eingabe der n Zahlen die summiert sollen. void readNumbers(int numbers[], int size) { int counter = 0; int zahl = 0; for(counter = 0; counter < size; counter++) { printf("Bitte geben Sie die %d.Zahl ein: ",(counter+1)); scanf("%d",&zahl); numbers[counter]= zahl; } } //------------------------------------------------------------------------------ int* cutArray(int array[],int half, int size) { int counter = half ; int i = 0; int size2 = size - half; right = size2; int array2 [size2]; int* pointer = &array2[0]; for(counter = half; counter < size;counter++) { array2[i] = array[counter]; array[counter] = 0; i++; } return pointer; } //------------------------------------------------------------------------------ void sumUpR(int *p) { pthread_mutex_lock (&mutex); int i = 0; for(i = 0; i < right;i++) { printf("addr: %p\n",p); printf("inhalt: %d\n",*p); sum += *p; p++; } pthread_mutex_unlock (&mutex); } //------------------------------------------------------------------------------ void sumUpL(int *p) { pthread_mutex_lock (&mutex); int i = 0; for(i = 0; i < left;i++) { sum += (*p); p++; } pthread_mutex_unlock (&mutex); }Weiss jemand wo da der Fehler liegt?
thx im Voraus!greetz
-
cutArraygibt einen Zeiger auf eine lokale Variable zurück, was halt einfach nicht korrekt funktionieren kann.
Also dynamische Speicherreservierung oder einfach nen zweites array übergeben, wo der teil reinkopiert wird.
Alternativ (was imo besser wäre) du nimmst ne struct in der du die start adresse des arrays (bzw dessen mitte) sowie die anzahl (=size/2) ablegst. Die übergibst du dann bei der erstellung.Im übrigen macht die parallelisierung keinen sinn, da nichts parallelisiert wird. Es müsste nur der zugriff auf sum synchronisiert werden.