FAQ: Threads in PB

Hier kannst du häufig gestellte Fragen/Antworten und Tutorials lesen und schreiben.
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: FAQ: Threads in PB

Beitrag von helpy »

STARGÅTE hat geschrieben:Mutex muss nicht sein, wenn es um Typen wie Long, Integer, Float usw. geht, da diese mit einem Zyklus geschrieben oder gelesen werden.
Hi STARGÅTE,

das stimmt so nicht!
Ob Mutex (oder andere Mechanismen) nötig sind, hängt nicht nur vom Datentyp ab. Angenommen, Du hast einen Zähler den zwei Threads hochzählen, dann brauchst Du da ebenfalls einen Mechanismus, um falsche Ergebnisse zu vermeiden. Das folgende Beispiel aus Wikipedia verdeutlicht dies:

Code: Alles auswählen

      Thread A          Thread B
==================================
zähler lesen      ----------------
----------------  zähler lesen
       ::                ::
um 1 erhöhen      ----------------
----------------  um 1 erhöhen
       ::                ::
zähler schreiben  ----------------
----------------  zähler schreiben
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: FAQ: Threads in PB

Beitrag von STARGÅTE »

Ja natürlich helpy.
Das einrucksvollste Beispiel ist ja, das "X = 1 And X = 0" Wahr ergeben kann:

Code: Alles auswählen

Global X.i

Procedure Wechsel(Null)
	Repeat
		X = 1-X
	ForEver
EndProcedure

CreateThread(@Wechsel(), 0)

For N = 1 To 10000
	If X=1 And X=0
		Debug "Ein Wunder"
	EndIf
Next
Mein "muss nicht sein" bezog sich darauf, dass es keine Systemfehler gibt (IMA, Overflow, usw.).
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
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: FAQ: Threads in PB

Beitrag von Danilo »

Die Option 'Threadsafe' schützt nur den PB-Internen String-Puffer in dem intern
Strings bearbeitet werden.

Mit Protected ist es OK, also lokaler String:

Code: Alles auswählen

Procedure hallo ( void)
    Protected text.s 
    startzeit = ElapsedMilliseconds() + 5000
    Repeat 
    text = Str(Random ( 50000)) + "_" + Str(Random ( 50000)) + "_" + Str(Random ( 50000))
    Delay(1)
    PrintN(text)
    Until startzeit < ElapsedMilliseconds() 
EndProcedure 

OpenConsole ()
For x = 1 To 50
CreateThread ( @hallo () , 0)
Next 

Input ()
Macht man text.s Global, muß man den Zugriff auf die Variable selbst absichern.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: FAQ: Threads in PB

Beitrag von PMV »

... es wäre sehr nett, wenn ab dem Post von Max_der_Held das
ganze gesplittet werden könnte. Fragen gehören in FAQs nicht wirklich
rein. :D


Max_der_Held hat geschrieben:Mit Verlaub, damit ich das richtig verstanden habe:
Mit Verlaub könnte man auch kurz und knapp sagen. Nix verstanden. :mrgreen:

Der Vollständigkeit halber:
@Max
Die Konsole ist eine geteile Ressorce. Da PB das nicht selber macht muss auch der Zugriff auf diese geschützt werden. (ändert sich das noch in PB V4.30?)
Das heißt auch die Print-Befehle müssen per Mutex geschützt werden.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten