[!] Verwendung von Threads mit Mutex

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
BahnFahrerDeluxe
Beiträge: 26
Registriert: 17.11.2005 11:05

[!] Verwendung von Threads mit Mutex

Beitrag von BahnFahrerDeluxe »

ich habe mal einen kleinen Test mit Threads und dem Zugriff aufs Strings via Mutex gemacht, scheint zu funktionieren.

Hier ist der Test:

Code: Alles auswählen

Global MyMutex.l
Global DerString.s

Procedure MyThread1(x)
  Repeat
    LockMutex(MyMutex)
    If DerString = "Thread 4"
      DerString = "Thread 1"
      Debug DerString
    EndIf
    UnlockMutex(MyMutex)
    Delay(10)
  ForEver
EndProcedure

Procedure MyThread2(x)
  Repeat
    LockMutex(MyMutex)
    If DerString = "Thread 1"
      DerString = "Thread 2"
      Debug DerString
    EndIf
    UnlockMutex(MyMutex)
    Delay(10)
  ForEver
EndProcedure

Procedure MyThread3(x)
  Repeat
    LockMutex(MyMutex)
    If DerString = "Thread 2"
      DerString = "Thread 3"
      Debug DerString
    EndIf
    UnlockMutex(MyMutex)
    Delay(10)
  ForEver
EndProcedure

Procedure MyThread4(x)
  Repeat
    LockMutex(MyMutex)
    If DerString = "Thread 3"
      DerString = "Thread 4"
      Debug DerString
      Debug "-------"
    EndIf    
    UnlockMutex(MyMutex)
    Delay(10)
  ForEver
EndProcedure

MyMutex = CreateMutex()
If MyMutex
  DerString = "Thread 1"
  Debug DerString
  CreateThread(@MyThread1(), 1)
  CreateThread(@MyThread2(), 1)
  CreateThread(@MyThread3(), 1)
  CreateThread(@MyThread4(), 1)
  
  Repeat
    Delay(100)
  ForEver
EndIf
Achtung - bitte mit dem Debugger laufen lassen, Programm läuft in einer Endlosschleife, via Debugger Programm beenden!!

cya

Euer BahnFahrer
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

Beitrag von MLK »

schickes beispiel!

hoffe mal solche codes werden gerettet bevor dieses temporäre-forum gelöscht wird.
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

MLK hat geschrieben:schickes beispiel!

hoffe mal solche codes werden gerettet bevor dieses temporäre-forum gelöscht wird.
Ich markiere Posts die später nicht gelöscht werden sollen mit einem "[!]" im Titel.

Betonung liegt auf Ich* ;)

*Die anderen Moderatoren dürfen natürlich auch mal ran
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1754
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

MLK hat geschrieben:hoffe mal solche codes werden gerettet bevor dieses temporäre-forum gelöscht wird.
Naja - und ich versuche ja auch fürs CodeArchiv mitzuspeichern... :wink:

(Öfters aber auch erstmal "nur" die Links, also bitte wirklich nicht wahllos Threads löschen.)
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
BahnFahrerDeluxe
Beiträge: 26
Registriert: 17.11.2005 11:05

Beitrag von BahnFahrerDeluxe »

Ich habe mal den Thread-Mutex-Test erweitert und den Code kompakter geschrieben. Der Test soll einfach die Robustheit dieser neuen Funktionen zeigen. Es darf immer nur ein Thread die String-Variable "ThreadString" bearbeiten und verändern, und nur dann wenn er an der Reihe ist. Versucht mal wieviele Threads euer System verträgt. Ihr könnt einfach die Konstante #MAX_THREADS auf einen höheren Wert setzten. Kann kein weiterer Thread mehr erzeugt werden, wird im Debugger eine Fehlermeldung geworfen.

Hier ist der Code:

Code: Alles auswählen

#MAX_THREADS = 100
#MAX_RANDOM = 500

Global MyMutex.l 
Global ThreadString.s 

Procedure MyThread(x) 
  Repeat 
    LockMutex(MyMutex) 
    If ThreadString = "Thread " + Str(#MAX_THREADS)
      ThreadString = "Thread 1" 
      Debug "----------"
      Debug ThreadString 
    ElseIf ThreadString = "Thread " + Str(x)
      ThreadString = "Thread " + Str(x + 1) 
      Debug ThreadString 
    EndIf 
    UnlockMutex(MyMutex) 
    Delay(Random(#MAX_RANDOM)) 
  ForEver 
EndProcedure 

MyMutex = CreateMutex() 
If MyMutex 
  ThreadString = "Thread " + Str(#MAX_THREADS) 

  For i = 1 To #MAX_THREADS
    If Not CreateThread(@MyThread(), i) 
      Debug "Thread Nr. " + Str(i) + " konnte nicht erzeugt werden!"
      End
    EndIf
  Next i
  
  Repeat 
    Delay(100) 
  ForEver 
EndIf
cya

Euer BahnFahrer
Gesperrt