Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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;

	}

.....

Geschrieben

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.

Geschrieben

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

Geschrieben

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();

}

Geschrieben

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 ?

Geschrieben
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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...