2016-11-15 6 views
2

Ich bin dabei, über Thread-Programmierung zu lernen und habe eine Testübung ausgeführt, um zu sehen, wie es funktioniert, wenn Sie eine Funktion von pthread_create aufrufen, aber ich habe seltsame Ergebnisse dabei . Hier ist mein Code:Inkonsistente Werte beim Drucken von einem Thread

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <pthread.h> 

pthread_t *threads; 

typedef struct _file { 
    int num1; 
    int num2; 
} file; 

void thread_run(void *thing) { 
    file *fp = thing; 

    printf("num1: %d num2: %d\n", fp->num1, fp->num2); 

} 

int main(int argc, char **argv) { 

    threads = (pthread_t *)malloc(atoi(argv[1])); 

    file *args = malloc(sizeof(file)); 
    args->num1 = 0; 
    args->num2 = 0; 
    int i; 
    for (i = 0; i < atoi(argv[1]); i++) { 
     args->num1 = i; 
     args->num2 = i + 1; 
     pthread_create(&threads[i], NULL, (void *)thread_run, (void *)&args); // the (void *) cast is necessary on my linux distro 
    } 

    for (i = 0; i < atoi(argv[1]); i++) { 
     pthread_join(threads[i], NULL); 
    } 

    return 0; 
} 

Was ich versuche, hier zu haben ist, wenn ich die Fäden in der for-Schleife erstellen, speichere ich sie alle in meinem * Themen Zeiger.

Dann rufe ich die Methode thread_run mit einem Strukturparameter auf, der zwei ganzzahlige Werte enthält, die ich ausdrücke.

Mein Wissen die erwartete Ausgabe dieses Programms bei der Ausführung mit ./a.out 3 sein soll:

num1: 0 num2: 1 
num1: 1 num2: 2 
num1: 2 num2: 3 

jedoch der Ausgang I variiert bin immer jedes Mal, aber in der Regel im Einklang mit so etwas wie:

num1: 34185264 num2: 0 
num1: 34185264 num2: 0 
num1: 34185264 num2: 0 

ich habe ein paar Fragen mit einem ähnlichen Thema bemerkt, aber keiner der anderen Nutzer scheint das Problem zu sein, die ich beschrieben habe.

Antwort

2

Jeder Thread hat einen Zeiger auf genau die gleiche Struktur. Daher werden sie dieselben Werte drucken. Sie sollten malloc() eine neue Struktur für jeden Thread innerhalb der for-Schleife.

Außerdem wird args als file *args deklariert. Beachten Sie, dass dies bereits ein Zeiger ist, also sollten Sie ihn direkt weiterleiten als seine Adresse:

pthread_create(&threads[i], NULL, (void *)thread_run, (void *)args); 
+0

Also sollte ich jedes Mal in der for-Schleife malloc'ing für eine neue Struktur? –

+2

Der Code übergibt auch '& args' an' pthread_create() ', wo er' args' übergeben soll. –

+1

@NicholasDry ja, das ist eine mögliche Lösung –

Verwandte Themen