Ich lerne, wie Sie Threads in C verwenden, und versuche eine Worker-Funktion (eine mit einer 'void* helperFunc(void *arg)
' Signatur) zu verwenden, um eine reguläre Funktion aufzurufen und übergeben Sie die Adresse einer Ganzzahl in einem Array.C-Threads geben Müllausgabe beim Zugriff auf nicht freigegebene Ressource
Manchmal ist die Ausgabe korrekt (eine Liste von Nullen). In anderen Fällen gibt es Garbage-Werte anstelle von 0.
Keiner der Threads versucht, auf freigegebene Ressourcen zuzugreifen, und ich glaube, ich habe das Array korrekt initialisiert, so dass ich nicht verstehe, woher die Garbage-Werte kommen .
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>
#define N 10
void runMe(int *arg) {
printf("Hello %d\n", *arg);
}
void *helperFunc(void *arg){
runMe((int*)arg);
}
int run_threads(void){
pthread_t thread[N];
int num[N] = {0};
int i = 0;
for (i = 0; i < N; i++){
pthread_create(&(thread[i]), NULL, helperFunc, &(num[i]));
}
}
int main(){
run_threads();
sleep(1);
return 0;
}
Erwartete Ausgabe:
Hello 0
Hello 0
Hello 0
Hello 0
Hello 0
Hello 0
Hello 0
Hello 0
Hello 0
Hello 0
tatsächliche Ausgang:
Hello 0
Hello 0
Hello 0
Hello 0
Hello 0
Hello 0
Hello 32757
Hello 4195339
Hello 0
Hello -334463544
Jede Hilfe würde geschätzt.
Danke. Ich habe das Problem mit Hilfe von malloc korrigiert, um Platz für die ganzen Zahlen zu reservieren. –
@ChrisJolly: Wenn Sie etwas Nützliches mit dem Array machen wollen, müssen Sie darüber nachdenken, es zurückzugeben, damit es freigegeben werden kann, und sich darüber sorgen, wie Sie darauf warten, dass die Threads beendet werden (1) 'ist ungeschickt -' Pthread_join() '?), Etc. Vielleicht ist das für die Zukunft; es sauber zu machen ist ein Anfang. –
Danke. Ich habe wieder ein Array von Ints verwendet, mit pthread_join, damit alle fertig ausgeführt werden können, bevor run_threads zurückkehrt. –