pthread-Probleme Speicherzugriffsfehler mit globalen Variablen



  • Hallo Leute, ich schreibe gerade an einem Programm, welches bei einer Matrixmultiplikation jede Spalte in einem eigenen Thread multiplizieren soll. Das Programm wirft aber zur Laufzeit einen Speicherzugriffsfehler(markiert im Code) und ich habe absolut keine Ahnung woran das liegen könnte

    /*
     * main.c
     *
     *  Created on: 21.11.2011
     *      Author: heiko
     */
    
    #include <pthread.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    double **a, **b, **c;
    
    int n;
    
    void *mult(void *not){
    	double d = 0.0;
    	double u = 0.0, v = 0.0;
    	int *z = (int*) not;
    	int z2 = *z;
    	int e,f;
    	for(f = 0; f < n; ++f){
    		for(e = 0; e < n; ++e){
    			u  = a[f][e];// Segmentation fault
    			v = b[e][z2];
    			d += (u*v);
    		}
    		c[f][z2] = d;
    	}
    
    	return 0;
    }
    
    int main(int argc, char* argv[]){
    	n = atoi(argv[1]);
    
        double **a, **b;
        a = (double**)malloc(sizeof(double*)*n);
        int i,j;
        for(i=0; i < n; ++i){
          a[i] = (double*)malloc(sizeof(double)*n);
        }
        b = (double**)malloc(sizeof(double*)*n);
        for(i=0; i < n; ++i){
          b[i] = (double*)malloc(sizeof(double)*n);
        }
        c = (double**)malloc(sizeof(double*)*n);
        for(i=0; i < n; ++i){
           c[i] = (double*)malloc(sizeof(double)*n);
        }
    
        //Matrizen a und b intialisieren
        for(j = 0; j < n; ++j){
        	for(i = 0; i < n; ++i){
        		a[i][j] = (i+2)*(j+1);
        		b[i][j] = (i+2)*(j+1);
        		c[i][j] = 0.0;
        	}
        }
    
        pthread_t *threads;
       	threads = (pthread_t*)malloc(sizeof(pthread_t)*n);
       	int *x;
       	x = (int*)malloc(sizeof(int*)*n);
    
        for(j = 0; j < n; ++j){
    
        	x[j] = j;
    
        	pthread_create(&threads[j], NULL, &mult, &x[j]);
    //    	pthread_join(threads[j],NULL);
        }
    
        for(j = 0; j < n; ++j){
        	for(i = 0; i < n; ++i){
        		printf("%f", c[i][j]);
        	}
        	printf("\n");
        }
    
        return 0;
    }
    

    Danke schon mal für die Hilfe


  • Mod

    Dein globales a, b und c ist immer 0, weil du sie in der main mit lokalen Variablen verdeckst. Wie dir leicht jeder Debugger oder etwas stärker warnende Compiler gesagt hätte.

    edit: Das c nicht, aber das ist auch egal. Die Nullpointerzugriffe über a und b sind schon genug für einen Segfault.

    edit2: Und bevor man den ersten Kommandozeilenparameter durch atoi jagt, sollte man vielleicht mal prüfen, ob es ihn überhaupt gibt. Und hinterher prüfen, ob es überhaupt eine Zahl war. Und noch allerlei andere Designschwächen, die gleich bestimmt Wutz alle aufzählen wird.

    edit3: Und da ich das Programm sowieso automatisch von einem Speicherdebugger hab analysieren lassen um den Fehler so schnell zu finden, kann ich dir auch noch sagen, dass du Dicke Speicherlöcher hast. Was nicht überrascht, da du kein einziges free zu deinen vielen mallocs hast.



  • Danke für die Antwort, ist mir vor kurzem ebenfalls aufgefallen, läuft jetzt einwandfrei



  • SeppJ schrieb:

    edit3: Und da ich das Programm sowieso automatisch von einem Speicherdebugger hab analysieren lassen um den Fehler so schnell zu finden, kann ich dir auch noch sagen, dass du Dicke Speicherlöcher hast. Was nicht überrascht, da du kein einziges free zu deinen vielen mallocs hast.

    Blöde Frage: Ist es denn ratsam, free zu verwenden, wenn bis Laufzeitende möglicherweise Gebrauch von der Variable gemacht wird?



  • Mit dem return 0; in main() ist das Programm zu Ende. Und davor sollte das free kommen.


Anmelden zum Antworten