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.
Also sollte ich jedes Mal in der for-Schleife malloc'ing für eine neue Struktur? –
Der Code übergibt auch '& args' an' pthread_create() ', wo er' args' übergeben soll. –
@NicholasDry ja, das ist eine mögliche Lösung –