Verstehe ich nicht, mache ich was falsch oder PB oder erklärt es die Hilfe wieder nicht so richtig? Ich überlege jetzt zum ersten mal Semaphore wirklich zu nutzen. Aber ich merke, das mir mutex eventuell doch eher paßt.Anders als ein Mutex ist ein Semaphore-Objekt nicht "im Besitz" eines bestimmten Threads, was bedeutet dass Signal/Warte-Aufrufe nicht vom gleichen Thread erfolgen müssen, wie dies mit LockMutex() und UnlockMutex() der Fall ist.
Was ich nämlich nicht wußte, das mutex intern auch einen zähler hat.
so kann ich lockmutex() in einem thread mehrfach aufrufen OHNE unlock() aufzurufen und OHNE das der thread sich selbst blockiert.
blockeriert NICHT.LockMutex(mutex)
LockMutex(mutex)
Um aber den Zugriff einem anderen Thread zu gestatten, reicht nicht nur EIN unlock(), sondern es muß so oft kommen, wie auch lockmutex() aufgerufen wurde. Das hat mich doch ein wenig erstaunt. An sich ja unwichtig wenn man sauber programmiert.
WICHTIG:
Was ich aber gar nicht wußte und nie getestet habe und ich wohl auch nie einen unlockfehler hatte um es zu bemerken ist, daß man einen das Unlock aus jedem thread aufrufen kann. ruft Beispielweise Thread2 zwei mal lockmutex(mutex) auf und ruft DANACH Thread1 ebenfalls lockmutex(mutex) auf, so blockiert Thread 1 natürlich. jetzt ruft Thread3 einfach zwei mal unlock(mutex) auf und schon läuft thread1 weiter.
Ist das Absicht (normal) oder ein Fehler?
Weil ich das an sich echt super finde. Leider steht das so nicht in der Hilfe und ich habe es daher nicht genutzt.
Code: Alles auswählen
Global mutex = CreateMutex()
Procedure thread1(dummy)
Repeat
LockMutex(mutex)
Debug "thread1"
UnlockMutex(mutex)
Delay(1000)
ForEver
EndProcedure
Procedure thread2(dummy)
LockMutex(mutex)
LockMutex(mutex)
LockMutex(mutex)
TryLockMutex(mutex)
TryLockMutex(mutex)
Repeat
Debug "thread2"
Delay(1000)
ForEver
EndProcedure
Procedure thread3(dummy)
UnlockMutex(mutex)
UnlockMutex(mutex)
UnlockMutex(mutex)
UnlockMutex(mutex)
UnlockMutex(mutex)
Repeat
Debug "thread3"
Delay(1000)
ForEver
EndProcedure
CreateThread(@thread1(), 0)
Delay(4000)
CreateThread(@thread2(), 0)
Delay(4000)
CreateThread(@thread3(), 0)
Repeat
Delay(3000)
ForEverWenn das korrekt ist, bin ich ja hooooooch erfreut (und ärgerlich, das ich das nicht schon immer wußte)
Gruß
toshy
NAchtrag:
Trylockmutex() funktioniert genau so.