Expi Geschrieben 14. Juli 2005 Geschrieben 14. Juli 2005 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 Zitieren
TheyCallMeGeek Geschrieben 14. Juli 2005 Geschrieben 14. Juli 2005 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. Zitieren
Expi Geschrieben 14. Juli 2005 Autor Geschrieben 14. Juli 2005 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; } ..... Zitieren
Bubble Geschrieben 14. Juli 2005 Geschrieben 14. Juli 2005 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. Zitieren
Expi Geschrieben 14. Juli 2005 Autor Geschrieben 14. Juli 2005 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 Zitieren
Bubble Geschrieben 14. Juli 2005 Geschrieben 14. Juli 2005 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(); } Zitieren
Expi Geschrieben 14. Juli 2005 Autor Geschrieben 14. Juli 2005 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 ? Zitieren
Bubble Geschrieben 14. Juli 2005 Geschrieben 14. Juli 2005 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. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.