Interessant! Das wusste ich noch nicht.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.
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)
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.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.
Es wäre super, wenn mir das noch jemand erklärt.
(*) Es gibt leider kein Durchstreichen