2010-11-20 6 views
0

Ich schreibe einen Server, der einen Thread für jede ankommende Anfrage startet. Ich möchte die Anfragen und einige andere Dinge an den Thread übergeben. Dazu verwende ich eine Struktur, die zugeordnet ist und einen Zeiger enthält, der auf eine zugewiesene Zeichenfolge zeigt. Ich tue dies, um die Struktur für den Thread lebendig zu halten, selbst wenn der Haupt-Thread in seine nächste Schleife eintritt. Wenn ich den Zeiger auf diese Struktur zu meinem Thread übergeben, "verlor" der Zeiger in der Struktur, die auf die Zeichenfolge zeigen sollte, seine Informationen. Nun, ich bekomme eine EXC_BAD_ACCESS und ich habe keine Ahnung warum.Zeiger verloren, wenn zugewiesene Struktur mit Zeiger auf zugewiesene Zeichenfolge als Argument für Pthread übergeben wird

Jede Hilfe ist willkommen :-)

typedef struct _thdata 
{ 
    int socket; 
    int thread_no; 
    char *parameter; 
}thdata; 

void *thread_function(thdata *data) 
{ 
    printf("Thread %i: got:%s\n", 
      data->thread_no, data->parameter);<-EXC_BAD_ACCESS 
    ... 
    free data->parameter; 
    free data; 
    pthread_exit((void *)0); 
} 

int main(...) 
{ ... 
    while(1){ 
    ... 
     thdata *data; 
     data = (thdata*)malloc(sizeof(data)); 
     data->socket=connSocket; 
     data->thread_no=i; 
     data->parameter=(char*)malloc(strlen(param)+1); 
     strcpy(data->parameter, param); 
    ... 
     pthread_create(&p_thread, NULL, (void *(*)(void *))thread_function, 
        (void*) &data); 
    ... 
    } 
} 

Antwort

4

Sie vorbei die Adresse eines Zeiger, dh ein Zeiger auf einen Zeiger, zu pthread_create, aber was wollen Sie ist passieren die Adresse Ihres _thdata Objekts. Sie müssen die Zeiger auf das Objekt zu übergeben sich, wie:

pthread_create(&p_thread, NULL, thread_function, data); 

Auch gibt es keine Notwendigkeit, void* hier zu werfen.

+0

Ahhh ja ofcause, vielen Dank Ich habe zu oft durchgesehen, also habe ich es nicht mehr gesehen! – Schaltfehler

+0

Ich war so darauf konzentriert, meinen Code zu ändern, um auch strcpy zu machen. Ich habe nie bemerkt, dass mein Problem genau das gleiche war wie deines, pass auf das falsche Argument. + 1 – RyanfaeScotland