semaphore() vs. mutex() - mutex hat auch Zähler
Verfasst: 10.06.2012 00:29
Hilfedatei:
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.
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.
mutex() scheint somit genau so zu arbeiten wie semaphore() mit dem Unterschied, das man keinen Anfangswert angeben kann und so beim "runterzählen" mit lockmutex() nur ein Thread weiter laufen kann. wie das mit trymutex ist muß ich jetzt noch testen.
Wenn 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.
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.