Seite 2 von 2

Re: Threadverarbeitung und Mutex

Verfasst: 19.11.2018 20:20
von Sicro
NicTheQuick hat geschrieben:Was man auch wissen muss: Ein einzelner Thread kann einen Mutex mehr als nur einmal sperren (Reentrantlock). Um ihn wieder entsperren zu können, muss er genau so oft entsperrt werden wie er auch gesperrt wurde.
Interessant! Das wusste ich noch nicht.
Ich habe hier mal kurz ein Code geschrieben, der das testet:

Code: Alles auswählen

Global Mutex = CreateMutex()

Procedure Thread1(param)
  Repeat
    LockMutex(Mutex)
    LockMutex(Mutex)
    Debug "Thread1"
    UnlockMutex(Mutex)
    UnlockMutex(Mutex) ; <= Nach der 1. Code-Ausführung auskommentieren
    Delay(20)
  ForEver
EndProcedure

Procedure Thread2(param)
  Repeat
    LockMutex(Mutex)
    Debug "Thread2"
    UnlockMutex(Mutex)
    Delay(10)
  ForEver
EndProcedure

CreateThread(@Thread1(), 0)
CreateThread(@Thread2(), 0)
Delay(200)
NicTheQuick hat geschrieben:Warum ist das sinnvoll? Man muss sich so um weniger kümmern. Beispiel: Ich habe mehrere Procedures, die auf den selben Daten arbeiten und dafür am Anfang der Procedure den Mutex sperren und am Ende wieder entsperren. Wenn man jetzt innerhalb einer Procedure eine andere Procedure aufruft, die ebenfalls den Mutex sperrt, dann kommt es nicht zum Stillstand des Programms.
Dein Beispiel begründet für mich nicht, warum ein Mutex ein Stack* Zähler hat. LockMutex() könnte auch einfach nicht blockieren, weil der Thread den Mutex ja bereits "besitzt" und nicht nochmal "in Besitz" nehmen muss. Die Procedure, die von der Thread-Procedure aufgerufen wird, läuft ja im selbem Thread.
Es wäre super, wenn mir das noch jemand erklärt.

(*) Es gibt leider kein Durchstreichen /:->

Re: Threadverarbeitung und Mutex

Verfasst: 19.11.2018 20:30
von #NULL
Weil er ja wissen muss, beim wievielten UnlockMutex() er auch tatsächlich wieder freigeben soll.

Re: Threadverarbeitung und Mutex

Verfasst: 19.11.2018 22:40
von Sicro
@#NULL:
Danke, jetzt hat es "Klick" gemacht :allright: