Wie bricht man einen Endlosschleifen-Thread sicher ab?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Wie bricht man einen Endlosschleifen-Thread sicher ab?

Beitrag 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?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

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

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

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

Beitrag 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.
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

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

Beitrag von NicTheQuick »

Deine aktuelle Lösung ist die korrekte.
Antworten