2016-07-23 9 views
0

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.

Antwort

2

Sie übergeben Threads die Adresse eines Objekts, das beim Zugriff nicht garantiert ist. Sobald run_threads zurückkommt, existiert num nicht mehr.

+0

Danke. Ich habe das Problem mit Hilfe von malloc korrigiert, um Platz für die ganzen Zahlen zu reservieren. –

+1

@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. –

+0

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. –