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. :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