2016-04-06 6 views
2

Definition der StrukturThread-Management in C

typedef struct { 
    int a,b; 
}targ; 

1. Thread-Funktion:

void* sum(void *arg) { 
    int *s; 
    targ *p = (targ*)arg; 

    int i=p->a; 
    int j=p->b; 
    *s=i+j; 
    pthread_exit((void*)s); 
} 

2. Thread-Funktion:

void* pdt(void *arg) { 
    int *p; 
    targ *s= (targ*)arg; 

    int i=s->a; 
    int j=s->b; 
    *p=i*j; 
    pthread_exit((void*)p); 
} 

Haupt Thread-Funktion:

int main(void) { 
    int ret1,ret2; 
    pthread_t tid1,tid2; 
    targ *x; 

    x=(targ*)malloc(sizeof(targ)); 

    printf("enter the 2 numbers\n"); 
    scanf("%d%d",&x->a,&x->b); 

    printf("%d%d",x->a,x->b); 

    pthread_create(&tid1,NULL,sum,(void*)x); 
    pthread_create(&tid2,NULL,pdt,(void*)x); 

    pthread_join(tid1,(void**)&ret1); 
    pthread_join(tid2,(void**)&ret2); 

    printf("the sum and product of the 2 numbers is %d and %d\n",(int)ret1, (int)ret2); 

    return 0; 
} 

Ich bin nicht in der Lage zu verstehen, warum gibt es eine segfault obwohl ich die man Seiten für jede API verfolgt habe.

Das Programm soll verstehen, wie Thread-Funktionen miteinander arbeiten. Die Hauptfunktion übergibt die Werte an jede Thread-Funktion und sie geben einen Wert an die Hauptfunktion zurück.

+1

Sie vergeben nicht 'P' und 'S' (die ganzen Zahlen) überall, so werden sie Zeiger mit zufälligen Inhalt sein, was bedeutet, sie werden deutete auf einen zufälligen Ort im Speicher und (extrem wahrscheinlich) lösen einen segfault auf Zugang aus.Sie sollten "ret1" und "ret2" auch als int-Zeiger deklarieren, wenn Sie ihre Adresse an "pthread_join" übergeben und sie dann in "printf" dann dereferenzieren. – Siguza

Antwort

3

Sie haben keinen Speicher für die Zeigervariablen s und p zugewiesen. So ist der Segmentierungsfehler passiert. Sie sollten Speicher reservieren oder nur die Adresse verwenden.

1

Ihre Methode zum Zurückgeben und Drucken der Rückgabewerte aus den Threads ist nicht korrekt. Ich werde die Schritt für Schritt Lösung für einen Thread zeigen. Der andere hat die gleiche Lösung.

Ordnen Sie in der Thread-Funktion sum Speicherplatz für eine int-Variable zu, und speichern Sie das Ergebnis im Speicherzeiger auf s.

int *s = malloc(sizeof(int)); 
*s=i+j 

Dann den Zeiger auf diesen Speicher zurückgeben.

Jetzt müssen Sie den vom Thread zurückgegebenen Zeiger korrekt sammeln.

Die Funktion pthread_join benötigt als zweites Argument einen Zeiger auf einen Zeiger auf void. Sie übergeben einen Zeiger an einen int. Dies ist falsch, obwohl der Cast den Fehler unterdrückt. Statt einen Zeiger verwenden, um seine Adresse an die Funktion übergeben und zum Erlöschen:

void* ret1 = NULL; 
pthread_join(tid1, &ret1); 

Der Zeiger ret1 nun auf den gleichen Speicher zeigt, Zeiger zu s im Gewinde spitz. Dieser Speicher enthält das Ergebnis der Berechnung. Deklarieren Sie einen Zeiger auf int und speichern Zeiger auf diesen Speicher in es:

int* sm = ret1; 

dann den Wert drucken:

printf("%d\n" , *sm); 

Nachdem es nicht mehr den Speicher in der Funktion zugewiesen benötigt wird sum (Blick auf die malloc Anruf oben sollte) befreit werden:

free(sm);