PureBoard
http://forums.purebasic.com/german/

FAQ: Threads in PB
http://forums.purebasic.com/german/viewtopic.php?f=9&t=18374
Seite 2 von 2

Autor:  helpy [ 04.05.2012 06:51 ]
Betreff des Beitrags:  Re: FAQ: Threads in PB

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:
      Thread A          Thread B
==================================
zähler lesen      ----------------
----------------  zähler lesen
       ::                ::
um 1 erhöhen      ----------------
----------------  um 1 erhöhen
       ::                ::
zähler schreiben  ----------------
----------------  zähler schreiben

Autor:  STARGÅTE [ 04.05.2012 11:10 ]
Betreff des Beitrags:  Re: FAQ: Threads in PB

Ja natürlich helpy.
Das einrucksvollste Beispiel ist ja, das "X = 1 And X = 0" Wahr ergeben kann:
Code:
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.).

Autor:  Danilo [ 04.05.2012 19:19 ]
Betreff des Beitrags:  Re: FAQ: Threads in PB

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

Autor:  PMV [ 05.05.2012 16:09 ]
Betreff des Beitrags:  Re: FAQ: Threads in PB

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

Seite 2 von 2 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/