Fragen zur Benutzung von Threads

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
tft
Beiträge: 605
Registriert: 08.09.2004 20:18
Computerausstattung: GTX Titan , i9 9900K , 32 GB Ram , 500 GB SSD , 3 ASUS FullHD Monitore and more
Wohnort: Dachsen
Kontaktdaten:

Fragen zur Benutzung von Threads

Beitrag von tft »

Hallo,

Ich wünsche euch schöne Festtage und einen guten Rutsch ins neue Jahr.

Wenn ich 5 mal die Gleiche Procedure als Thread starte. Habe ich dann 5 eigenständige Instanzen der Prozedure ? Sollte ja eigentlich so sein
Da es ja CreateThread heist. Aber weis jemand was genaues?

Sagen wir mal. Ich rufe von jedem dieser Thread Eine Procedure aus dem Main Programm auf. Muss ich das mit Mutex sichern? Da es nur einen Code Bereich der Procedure gibt?. Oder wird die Procedure im Speicher bei jedem Aufruf erzeugt?

Die Funktion Thread Save. Auf was wirkt sich das alles aus? Werden alles PB Funktionen automatisch mit einem Mutex gesichert? So das immer nur ein Thread auf diese Funktion zugreifen kann? Und wie sieht es mit Variablen und Strukturen aus?

Danke und ich wünsche euch noch schöne Tage
TFT seid 1989 , Turgut Frank Temucin , Dachsen/Berlin/Antalya
Aktuelles Projekte : Driving School Evergarden
YouTube : Pure Basic to go
FaceBook : Temuçin SourceMAgic Games
DISCORD : SourceMagic
W10 , i9 9900K ,32 GB Ram , GTX Titan , 3 Monitore FHD
ARDUINO Freak :-)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Fragen zur Benutzung von Threads

Beitrag von NicTheQuick »

Ja, dann laufen 5 eigenständige Programmstränge. Prozeduren werden nicht pro Thread neu erzeugt. Der Programmcode existiert weiterhin nur einmal, aber 5 eigene Threads arbeiten diese dann unabhängig von einander ab. Wie wenn 5 Bäcker parallel das selbe Rezept backen. Jeder macht sein eigenes Ding, aber alle nutzen das selbe Rezept.

ThreadSafe wirkt sich meines Wissens nur auf Strings aus, aber bin mir nicht mehr 100%ig sicher. Es werden aber definitiv nicht automatisch neue Mutexe erzeugt oder ähnliches.

Strukturen haben auch nichts mit Threads zu tun. Die geben ja nur eine Struktur an und ändern sich nie. Bei globalen oder shared Variablen musst du allerdings aufpassen, wenn sie von mehreren Threads gleichzeitig verwendet werden. Das gilt natürlich auch für alle anderen dynamischen Strukturen wie Maps, LinkedLists oder Arrays.
Bild
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Fragen zur Benutzung von Threads

Beitrag von mk-soft »

ThreadSafe muss eingeschaltet werden für String, LinkedList, etc.
Um gemeinsam auf gleiche String oder LinkedList zuzugreifen, must du diese mit Mutex schützen.

Wenn eine Thread Procedure mehrfach verwendet wird, muss jeder einen eigen Speicherbereich übergeben werden.

Siehe Beispiel Multi Thread in Mini Thread Control
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Fragen zur Benutzung von Threads

Beitrag von STARGÅTE »

tft hat geschrieben: 25.12.2022 00:29 Sagen wir mal. Ich rufe von jedem dieser Thread Eine Procedure aus dem Main Programm auf. Muss ich das mit Mutex sichern? Da es nur einen Code Bereich der Procedure gibt?. Oder wird die Procedure im Speicher bei jedem Aufruf erzeugt?
Wenn die Prozedur komplett in sich abgeschlossen ist und keinerlei Zugriff auf andere Ressourcen hat, dann musst du kein Mutex benutzen. Dann wird ja einfach nur der Prozedur-Programmcode abgearbeitet, wobei alle (protected) Variablen innerhalb jeder Thread-Instance fürsich stehen. Das passiert automatisch.
Sobald du aber auf eine globale Variable zugreifst, oder auf (globale) Ressourcen, muss du das mit Mutex vor dem gleichzeitigen Zugriff schützen.
tft hat geschrieben: 25.12.2022 00:29 Die Funktion Thread Save. Auf was wirkt sich das alles aus? Werden alles PB Funktionen automatisch mit einem Mutex gesichert? So das immer nur ein Thread auf diese Funktion zugreifen kann? Und wie sieht es mit Variablen und Strukturen aus?
Auf deinen "eigenen" Code hat Thread Safe keine Auswirkung und unterstützt dich daher überhaupt nicht in Sachen Thread-Management. Thread Safe ist einzig und alleine eine Option für den Compiler, andere Versionen für Bibliotheken zu verwenden, die langsamer arbeiten, dafür aber im Gebrauch mit Threads zu keinem Absturz führen. Sobald du z.B. irgendwas mit Strings machst, selbst wenn diese wie oben geschrieben in einem völlig in sich abgekapselten Code wären, musst du Thread Safe aktivieren, einfach weil du Strings in Threads verwenden willst.
Deinen "eigenen" Code musst du stets selber sicher machen mit Mutex und Semaphore.
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
tft
Beiträge: 605
Registriert: 08.09.2004 20:18
Computerausstattung: GTX Titan , i9 9900K , 32 GB Ram , 500 GB SSD , 3 ASUS FullHD Monitore and more
Wohnort: Dachsen
Kontaktdaten:

Re: Fragen zur Benutzung von Threads

Beitrag von tft »

Hallo, danke für die Infos. Ich habe mir ein neues Ziel gesetzt. Threads müssen hehr. Aber der Umgang will gut sortiert sein.

Im Moment habe ich das Problem. Das ich Threads auslaufen lasse. Also ohne innere Endlosschleife. Und eigentlich sollten diese
Codebereiche nach dem Verlassen. Den Speicher wider freigeben. Also den Speicher den das Programm belegt. Der durch CreateThread()
Belegt wird. Aber ich habe noch keine Möglichkeit gefunden. Diesen Thread nochmal anzuspringen. Oder herauszufinden ob der Thread beendet wurde. Die Befehle IsThread ets, scheinen nicht wirklich zu funktionieren. Wenn der Thread ausgelaufen ist.

Auf jedenfall ein spannendes Feld.

Schöne Tage gruss TFT
TFT seid 1989 , Turgut Frank Temucin , Dachsen/Berlin/Antalya
Aktuelles Projekte : Driving School Evergarden
YouTube : Pure Basic to go
FaceBook : Temuçin SourceMAgic Games
DISCORD : SourceMagic
W10 , i9 9900K ,32 GB Ram , GTX Titan , 3 Monitore FHD
ARDUINO Freak :-)
Benutzeravatar
tft
Beiträge: 605
Registriert: 08.09.2004 20:18
Computerausstattung: GTX Titan , i9 9900K , 32 GB Ram , 500 GB SSD , 3 ASUS FullHD Monitore and more
Wohnort: Dachsen
Kontaktdaten:

Re: Fragen zur Benutzung von Threads

Beitrag von tft »

@MK_SOFT Danke für den Code. Der wird mir sicher weiter helfen. Danke und eine gute Zeit.
TFT seid 1989 , Turgut Frank Temucin , Dachsen/Berlin/Antalya
Aktuelles Projekte : Driving School Evergarden
YouTube : Pure Basic to go
FaceBook : Temuçin SourceMAgic Games
DISCORD : SourceMagic
W10 , i9 9900K ,32 GB Ram , GTX Titan , 3 Monitore FHD
ARDUINO Freak :-)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Fragen zur Benutzung von Threads

Beitrag von STARGÅTE »

Du hast einen sehr merkwürdigen Satzbau in deinem Post hier, den ich jetzt auch nicht zitieren möchte. Warum ist da nach jedem vierten bis sechsten Wort ein Punkt? Ich habe mehrere Anläufe gebraucht, um überhaupt zu verstehen was da geschrieben steht.

Wenn deine Prozedur, die du per CreateThread() gestartet hast, abgearbeitet wurde, dann wird der Thread automatisch aufgeräumt und "gelöscht". Wenn also IsThread null zurückgibt, dann ist der Thread fertig.
Mit aufräumen meine ich aber auch nur die üblichen Variablen und Definitionen, die auch bei einer normalen Prozedur wieder freigegeben werden, wenn diese fertig ist. Wenn du im Thread selbst irgendwelche Objekte oder Ressourcen erstellst, musst du diese selber wieder freigeben.
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
Antworten