Seite 1 von 1

Mutex mit globaler Variable geht nicht mehr

Verfasst: 22.12.2006 17:53
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 :|

Verfasst: 22.12.2006 18:04
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.

Verfasst: 22.12.2006 18:14
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.

Verfasst: 22.12.2006 18:16
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.

Verfasst: 22.12.2006 18:30
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.

Verfasst: 22.12.2006 18:46
von mk-soft
Tolle Fehlermeldung. Hatte globale Variable erst nach der Procedure deklariert.

Danke :wink:

Verfasst: 22.12.2006 18:51
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.