Seite 1 von 1

Wie bricht man einen Endlosschleifen-Thread sicher ab?

Verfasst: 19.10.2015 22:27
von STARGÅTE
Hallo Leute,

folgende Situation:
Ich habe einen Thread mit Endlosschleife (damit ich nicht immer wieder den Thread starten/erstellen muss) in dem WaitSemaphore() darauf wartet ein Signal zu bekommen und dann ein gewisser Code ausgeführt wird.
Nun möchte ich aber irgendwann diesen Thread wieder beenden bzw. abbrechen, wie gehe ich nun vor?
  • KillThread() ist zu radikal, und ermöglicht den Thread nicht seinen Stack aufzuräumen.
  • Eine Abbruchbedingung der Endlosschleife kann unmöglich erreicht werden, wenn WaitSemaphore() im Wartemodus ist.
  • TrySemaphore() mit eigenem Delay() erscheint mir zu unsauber, zumal es dann Problem bei mehreren Semaphores gibt, da müsste ich dann mehrere Schleifen ineinander packen, damit ein Try nicht mehrmals ausgeführt wird.
Meine aktuelle Lösung wäre nun die:
Die Abbruchbedingung setzen, dann aber auch allen Semaphores ein Signal zu geben, dann aber vorher noch zu testen, ob der Code denn wirklich noch ausgeführt werden soll.

Code: Alles auswählen

Procedure MyThread(Void)
	Repeat
		WaitSemaphore()
		If Abbruchbedingung
			Break
		EndIf
		; Do what you have to do!
	ForEver
EndProcedure
Aber ist das wirklich sinnvoll?
Ist das überhaupt sicher, wenn mit einem mal alle den Wert von 'Abbruchbedingung' lesen?
Gibt es einen anderen Weg?

Re: Wie bricht man einen Endlosschleifen-Thread sicher ab?

Verfasst: 19.10.2015 22:31
von RSBasic
Hast du schon getestet, ob FreeSemaphore() funktioniert?
Dann sollte WaitSemaphore() automatisch abgebrochen werden (nicht getestet), so dass du bei deiner Abbruchsbedingung sauber aussteigen kannst.

Re: Wie bricht man einen Endlosschleifen-Thread sicher ab?

Verfasst: 20.10.2015 07:46
von mhs
Meine aktuelle Lösung wäre nun die:
Die Abbruchbedingung setzen, dann aber auch allen Semaphores ein Signal zu geben, dann aber vorher noch zu testen, ob der Code denn wirklich noch ausgeführt werden soll.
Das ist eine herkömmliche Lösung für das Problem. Wenn alle Threads nur lesend auf die Abbruchbedingung zugreifen ist das auch weiter kein Problem.
Also Abbruchbedingung setzen, Signal geben, alle Threads lesen die Abbruchbedingung und beenden die Schleife.
Hast du schon getestet, ob FreeSemaphore() funktioniert?
FreeSemaphore funktioniert meines Wissens nicht. Beim Free wird kein Signal erzeugt und die Threads warten weiter.

Re: Wie bricht man einen Endlosschleifen-Thread sicher ab?

Verfasst: 20.10.2015 09:52
von NicTheQuick
Deine aktuelle Lösung ist die korrekte.