Seite 2 von 2
Re: FAQ: Threads in PB
Verfasst: 04.05.2012 06:51
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
Re: FAQ: Threads in PB
Verfasst: 04.05.2012 11:10
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.).
Re: FAQ: Threads in PB
Verfasst: 04.05.2012 19:19
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.
Re: FAQ: Threads in PB
Verfasst: 05.05.2012 16:09
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.
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.
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