Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Thread beenden

Empfohlene Antworten

Veröffentlicht

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

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.

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;

	}

.....

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.

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

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

}

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 ?

ok, habs.

thx

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.