Veröffentlicht 14. Juli 200520 j Hy leute, ich möchte das mein c programm eine funktion aufruft, welche dann wieder einen Thread erstellt. Da die Funktion aber beendet wird nachdem sie den Thread erstellt hat ist es nicht möglich den Thread durch sie wieder zu beenden, da die pthread_t t; (siehe code unten) nichtmehr gültig ist. int Run = 0; void startThread(const input * const u) { pthread_t t; // <---- if (!u->arg1) { printf("Es wurde keine Option angegeben (an/aus) !"); return; } if (!strcmp(u->arg1,"an")) { if(Run == 0) { pthread_create(&t, NULL, init, NULL); pthread_detach(t); } else { u_respond(u,"Der Thread läuft bereits !"); return; } } else if (!strcmp(u->arg1,"aus")) { if(lRun != 0) { int can; can = pthread_kill(t, SIGKILL); if((can == 0)) { Run--; printf("Der Thrad wurde beendet !"); return; } else { printf("Fehler beim beenden des Threads !!"); return; } } else { printf("Der Thread ist bereits AUS !"); return; } } else { printf("Unbekannte Option ! Es gibt nur \"an\" oder \"aus\" !"); return; } return; } Hab versucht die pthread_t t; global zu definieren, gab aber nur abstürze zur folge. Hat jemand ne idee ? Thx
14. Juli 200520 j Haben Threads keine Handles? Den speichern. Oder einfach einen global definierten Pointer auf jenen Thread richten. Aber Erfahrung habe ich damit auch nicht - komme nicht aus der cpp-welt, sry.
14. Juli 200520 j wie richte ich einen globalen pointer auf den Thread? wenn ich pthread_t t; so definier gehts auch nich: int Run = 0; pthread_t t; // <-- jetzt hier void startThread(const input * const u) { // pthread_t t; // <---- Hier war es vorher if (!u->arg1) { printf("Es wurde keine Option angegeben (an/aus) !"); return; } .....
14. Juli 200520 j Du musst eine Liste an Threads verwalten und den zu beendenden Threads eine Nachricht zukommen lassen, so dass sich der jeweilige Thread _selbst_ beendet. Einen Thread zwangsweise zu beenden ist extrem unsauber, da ihm sonst keine Möglichkeit gegeben wird eventuell belegte Ressourcen wieder freizugeben. Eine ganz einfache Möglichkeit ist es in einem gemeinsamen Speicherbereich ein Flag zu verwalten. Ist es gesetzt, muss sich Dein Thread beenden. Ob das Flag gesetzt wird, kannst Du von einem anderen Thread (z.B. dem Hauptprogramm) aus steuern.
14. Juli 200520 j kannst du mir dazu ein beispiel geben ? das versuche ich nämlich grade, aber das bekomm ich auch nich ganz hin, der speicher wird nicht freigegeben. thx
14. Juli 200520 j Allgemein (Pseudocode): bool runThread; void ThreadFunktion() { while(runThread == true) { printf("Hallo\n"); Warte_2_Sekunden(); } // Hier eventuell belegte Resourcen freigeben } void Hauptprogramm() { runThread=true; StarteThread(ThreadFunktion); Mache_etwas_anderes(); runThread=false; // Threads beenden Warte_auf_Ende_aller_Threads(); Hauptprogramm_Beenden(); }
14. Juli 200520 j ok, das mit dem flag hab ich hinbekommen. aber wie warte ich auf das beenden der Threads wenn sie doch detached laufen ? und wie geb ich den Speicher wieder frei falls es nicht automatisch durch pthread_exit( NULL ); passiert ?
14. Juli 200520 j aber wie warte ich auf das beenden der Threads wenn sie doch detached laufen ? Indem Du mit dem Zeiger, den Du beim Erstellen des Threads zurückerhalten hast, überprüfst, ob der Thread noch aktiv ist. und wie geb ich den Speicher wieder frei falls es nicht automatisch durch pthread_exit( NULL ); passiert ? Jeder Thread sollte beim Beenden, also nach dem Verlassen seiner Hauptschleife, seinen Speicher und alle übrigen belegten Resourcen ganz normal mit delete, free, usw. freigeben.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.