2017-02-26 4 views
1

Dies ist eine abgekürzte Version meines Codes. Ich sollte klarstellen, dass "initializeGrid()" sich richtig verhält, also habe ich es aus Gründen der Kürze nicht aufgenommen. Ich versuche, "threadFunction()" zu erhalten, um die Werte in args zu drucken, aber es funktioniert nicht. Bitte helfen Sie!Warum laicht mein Thread nicht korrekt ab? C

#include <pthread.h> 
#include <math.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <memory.h> 

int gridSize = 12; 

typedef struct threadParameter { 
    float * grid; 
    int top; 
    int bot; 
}threadParameter; 

void* threadFunction(void* args) { 

    threadParameter *param = (threadParameter*) args; 
    printf("%d, %d", param->bot, param->top); 
    return 0; 

} 

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

    int numProcs = 4; 

    pthread_t * threadsArr = malloc(numProcs * sizeof(pthread_t)); 

    float mainGrid[gridSize][gridSize]; 
    memset(mainGrid, 0, gridSize*gridSize * sizeof(float)); 
    initializeGrid(1.0, 2.0, 3.0, 4.0, mainGrid); 

    threadParameter t = {&mainGrid[0][0], 0, gridSize}; 
    int ret = pthread_create(&threadsArr[0], 0, threadFunction, (void*)&t); 

} 

Antwort

2

Ihre main() Funktion kehrt sofort nach dem Aufruf pthread_create().

Wenn main() zurückgegeben wird, wird der Prozess beendet und mit jedem erstellten Thread beendet.

Sie müssen einen pthread_join() Aufruf hinzufügen, um auf das Beenden des Threads zu warten. Per die pthread_join() POSIX standard:

Die pthread_join() Funktionsausführung des rufenden Thread, bis das Ziel suspendieren soll thread endet

So:

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

    int numProcs = 4; 

    pthread_t * threadsArr = malloc(numProcs * sizeof(pthread_t)); 

    float mainGrid[gridSize][gridSize]; 
    memset(mainGrid, 0, gridSize*gridSize * sizeof(float)); 
    initializeGrid(1.0, 2.0, 3.0, 4.0, mainGrid); 

    threadParameter t = {&mainGrid[0][0], 0, gridSize}; 
    int ret = pthread_create(&threadsArr[0], 0, threadFunction, (void*)&t); 

    pthread_join(threadsArr[0], NULL); 
} 
+0

Vielen Dank, @ Andrew Henle! Das ist genau das Problem. Vielen Dank für Ihre schnelle und detaillierte Antwort! – SupposedlySleeping

+1

Eine andere Möglichkeit, dieses Problem zu lösen, wäre ein 'pthread_exit' anstelle einer impliziten Rückkehr von' main'. Dies hält den Prozess am Leben und lässt alle anderen Threads wie gewünscht enden. –

Verwandte Themen