2016-03-21 15 views
0

Ich versuche, die Thread-ID über eine Struktur zu senden, weil ich später mehrere Argumente senden müssen. Wenn ich data-> arg1 = t, und versuche, Daten über zu senden, dann speichern Sie die Thread-ID in der PrintHello-Funktion, ich bekomme Werte, die ich nicht sollte. Wenn ich meine Struktur alle zusammen herausnehmen und t einfach von selbst senden, funktioniert das Programm wie erwartet. Weiß jemand, warum das sein könnte?Senden von Pthread mit mehreren Argumenten

#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <sys/types.h> 
#include <sys/wait.h> 
#include <errno.h>  
#include <strings.h>  
#include <pthread.h>  

#define NUM_THREADS  5 

void *PrintHello(void *threadid) 
{ 
    struct data *someData = threadid; 
    long threadsID = someData->arg1; 
    sleep(2); 
    printf("Thread %ld\n", threadsID); 
    pthread_exit(NULL); 
} 

int main (int argc, char *argv[]) 
{ 
    pthread_t threads[NUM_THREADS]; 
    pthread_attr_t attr; 
    struct myStruct data; 
    long t; 
    void *status; 

    for(t=0; t<NUM_THREADS; t++){ 
    data.arg1 = t; 
    pthread_create(&threads[t], &attr, PrintHello, (void *)&data);   
    } 

    pthread_attr_destroy(&attr); 
    for (t=0; t < NUM_THREADS; t++) { 
     pthread_join(threads[t], &status); 

    } 
    pthread_exit(NULL); 
} 

Ich deklarierte die Struktur in einer separaten Header-Datei.

Antwort

0

Dies liegt daran, dass die Struktur möglicherweise aktualisiert wird, bevor die Threads ihre Daten lesen. Sie sollten separate Strukturen für jeden Thread zuweisen.

Versuchen Sie folgendes:

int main (int argc, char *argv[]) 
{ 
    pthread_t threads[NUM_THREADS]; 
    pthread_attr_t attr; 
    struct myStruct data[NUM_THREADS]; 
    long t; 
    void *status; 

    for(t=0; t<NUM_THREADS; t++){ 
    data[t].arg1 = t; 
    pthread_create(&threads[t], &attr, PrintHello, &data[t]);   
    } 

    pthread_attr_destroy(&attr); 
    for (t=0; t < NUM_THREADS; t++) { 
     pthread_join(threads[t], &status); 

    } 
    pthread_exit(NULL); 
} 
Verwandte Themen