Rückgabewert aus einem Thread auswerten.
-
typedef struct { int fd; int status; }response_client; void *action() { resp.fd = 2; resp.status = 1; pthread_exit(&resp); } int main() { pthread_t t1; void* fd; void* resp; if(pthread_create(&t1, NULL, &action, NULL) != 0) { fprintf(stderr, "Fehler bei Thread 1......\n"); exit(0); }else{ printf("Thread wurde erstellt!\n"); } pthread_join(t1, &resp); printf("Filediskriptor %d\n\n",resp->status); //wie muss die Umwandlung aussehen? return 0; }
Hallo, kann mir jemand helfen?^^
Wie muss die Umwandlung von void auf die Struktur response_client aussehen, wenn ich den Wert ausgeben möchte? Egal was ich versuche, ich bekomme jedes mal"error: request for member ‘status’ in something not a structure or union"
Der Code ist stark gekürzt, daher bitte keine Fragen zum Sinn und Zweck : ).
-
Hi,
check this out:printf("Return value: %d\n",*(int*)resp);
Du willst nicht nach response_client umwandeln, sondern nach int.
Woher kennt die Funktion action() die Variable resp?Gruß,
B.B.
-
typedef struct { int fd; int status; }response_client; void *action() { response_client resp; resp.fd = 2; resp.status = 1; pthread_exit(&resp); } int main() { pthread_t t1; void* fd; void* resp; if(pthread_create(&t1, NULL, &action, NULL) != 0) { fprintf(stderr, "Fehler bei Thread 1......\n"); exit(0); }else{ printf("Thread wurde erstellt!\n"); } pthread_join(t1, &resp); printf("Filediskriptor %d\n\n",*(int*)resp->status); //wie muss die Umwandlung aussehen? return 0; }
Oh, war wohl ein fehler aufgrund der Codekürzung. Dennoch leider unverändert:
test.c:55: error: request for member ‘status’ in something not a structure or union //edit(bei mir zeile 55 anstatt 45 wegen den includes)
Es heisst ja, dass diese Meldung kommt, wenn man anstatt dem -> Operator ein Punkt setzt bei einem Zeiger auf eine Struktur. In dem Fall wird ja ein void Zeiger übergeben bzw. soll die Adresse in einem void Zeiger abgespeichert werden.
Langsam verzweifel ich daran, ich glaube ich mache mal eben eine Pause.
-
Also, wen es interessiert, die Lösung ist folgendermassen:
typedef struct { int fd; int status; }response_client; void *action() { response_client *resp = malloc(sizeof(response_client)); resp->fd = 2; resp->status = 1; pthread_exit(resp); } int main() { pthread_t t1; void* fd; response_client *resp; if(pthread_create(&t1, NULL, &action, NULL) != 0) { fprintf(stderr, "Fehler bei Thread 1......\n"); exit(0); }else{ printf("Thread wurde erstellt!\n"); } pthread_join(t1, (void**)&resp); printf("Filediskriptor %d\n\n",resp->status); free(resp); return 0; }
-
Was ist ein Thread?
-
Ha, da verweise ich auf reichlich Literatur und wikipedia!
-
Ich glaube er versucht dir zu sagen, dass ANSI C nix mit Threads anfangen kann
-
Jetzt wo du es sagst^^. Ich werde in Zukunft besser überlegen, wo was hingehört.
-
Grafzahl schrieb:
Jetzt wo du es sagst^^. Ich werde in Zukunft besser überlegen, wo was hingehört.
Oder schreib wenigstens dazu, aus welchem Themenbereich das kommt, sonst sitzt man da und versteht nur Bahnhof.
-
Grafzahl schrieb:
Also, wen es interessiert, die Lösung ist folgendermassen:
Ach, du willst deinen eigenen Tread-Exit-Status definieren? Ich dachte du brauchst den System-Rückgabewert!
Das ist aber ein bisschen unglücklich mit deinem malloc mitten in der Threadfunktion!
Hier ist ne IMO bessere Alternative (Erstes Codebeispiel Example Code - Pthread Creation and Termination - weiter unten):
https://computing.llnl.gov/tutorials/pthreads/
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
sowas sollte auch möglich sein
printf("%d\n%d",((response_client*)resp)->fd,((response_client*)resp)->status);
-
Ich merke grad, dass es eigendlich totaler Schwachsinn ist, für meine Zwecke irgendwelche Variablen zurück zu geben, dass sinnvollste wäre das Ganze mit Mutexe und globalen Variablen zu lösen.