Mutex mit globaler Variable geht nicht mehr

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Mutex mit globaler Variable geht nicht mehr

Beitrag von mk-soft »

Mutex Variable als Global geht nicht mehr. Warum?

Code: Alles auswählen

Procedure WithoutMutex(Number)     
    ;Shared Mutex
    
    For a = 1 To 5      
      LockMutex(Mutex)    ; entfernen Sie das ';' um den Unterschied zu sehen
    
      PrintN("Thread "+Str(Number)+": Trying to print 5x in a row:")
      For b = 1 To 5
        Delay(50)
        PrintN("Thread "+Str(Number)+" Line "+Str(b))
      Next b          
      
      UnlockMutex(Mutex) ; entfernen Sie das ';' um den Unterschied zu sehen
    Next a    
  EndProcedure

  Global Mutex
  
  OpenConsole()
  Mutex = CreateMutex()
  
  thread1 = CreateThread(@WithoutMutex(), 1)
  Delay(25)
  thread2 = CreateThread(@WithoutMutex(), 2)
  Delay(25)
  thread3 = CreateThread(@WithoutMutex(), 3)
  
  WaitThread(thread1)
  WaitThread(thread2)
  WaitThread(thread3)
  
  Input()
FF :|
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Weils unlogisch ist. Mutex ist ein Objekt, das immer nur einem Thread zur
Verfügung steht. Global ist immer und überall verfügbar.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Entferne das ; vor dem SHARED, und es sollte wieder funzen.
Weils unlogisch ist. Mutex ist ein Objekt, das immer nur einem Thread zur
Verfügung steht. Global ist immer und überall verfügbar.
Es ist nicht unlogisch. In der Variablen 'mutex' wird, so stelle ich mir das vor, eine Art *Pointer zum eigentlichen Mutex gespeichert. In dem Pointer steht dann, welcher Thread gerade das unstreitbare Recht zum AUsführen hat.

So wie der Code jetzt ist (SHARED ist auskommentiert) wird versucht, eine protected Variable auszulesen. 0 ist aber kein gültiger Pointer zum eigentlichen Mutex.

Du hast zwar Recht, TS-Soft, es kann wegen der Mutex immer nur ein Thread gleichzeitig ausgeführt werden, aber: Die Pointer-Adresse muss global (oder zumindest SHARED sein), damit jeder Thread/Procedure die Möglichkeit hat, den Pointer des Mutex' auszulesen.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Gebe dir teilweise rechts. Mutex wird aber im Hauptprogramm erzeugt.
Somit muss also Shared Variablen auch im Hauptprogramm verfügbar sein.
Das finde ich wieder Unlogisch.

FF :wink:

P.S.
Entferne das ; vor dem SHARED, und es sollte wieder funzen
Habe ich doch mit absicht gemacht, da es vorher mit Globaler Variable funktioniert hat.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

so:

Code: Alles auswählen

Global Mutex

Procedure WithoutMutex(Number)
  ;Shared Mutex

  For a = 1 To 5
    LockMutex(Mutex)    ; entfernen Sie das ';' um den Unterschied zu sehen

    PrintN("Thread "+Str(Number)+": Trying to print 5x in a row:")
    For b = 1 To 5
      Delay(50)
      PrintN("Thread "+Str(Number)+" Line "+Str(b))
    Next b

    UnlockMutex(Mutex) ; entfernen Sie das ';' um den Unterschied zu sehen
  Next a
EndProcedure



OpenConsole()
Mutex = CreateMutex()

thread1 = CreateThread(@WithoutMutex(), 1)
Delay(25)
thread2 = CreateThread(@WithoutMutex(), 2)
Delay(25)
thread3 = CreateThread(@WithoutMutex(), 3)

WaitThread(thread1)
WaitThread(thread2)
WaitThread(thread3)

Input()
Funktionierts auch mit der globalen Variable. Trotz allem solltest Du lieber Shared nutzen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Tolle Fehlermeldung. Hatte globale Variable erst nach der Procedure deklariert.

Danke :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

note:

Shared ist automatisch immer im Hauptcode bekannt.
das wird besonders deutlich, wenn man mit EnableExplicit arbeitet,
dann muss eine variable im hauptcode Defined werden,
damit sie in den Procs Shared werden kann.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Gesperrt