Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Semaphor
Bergmann89 - Mi 29.12.10 10:43
Titel: Semaphor
Hey,
ich brauch für eins meiner Projekte ein Semaphor, also hab ich mir ne Klasse geschrieben, die mir das ganze etwas vereinfacht. Hier mal die Wait- und Signal-Methoden
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TSemaphor.Wait; begin dec(fCount); if fCount < 0 then SuspendThread; end;
procedure TSemaphor.Signal; begin inc(fCount); if fCount <= 0 then ResumeThread; end; |
Jetzt zum Problem: Der Counter wird mit 1 initialisiert. Thread 1 kommt in die Wait-Methode und veringert den Counter (auf 0). Dann ist Thread 2 an der Reihe, kommt auch in die Wait-Methode und verringert den Counter (auf -1). Überprüft den Counter und wird schlafen gelegt, weil er kleiner als 0 ist. Dann ist Thread 1 wieder an der Reihe. Auch er überprüft den Counter, der ist -1, also geht auch Thread 1 schlafen. Bei diesem Szenario würde es ja zu einem DeadLock kommen, oder hab ich irgendwo einen Denkfehler drin?
MfG Bergmann.
Jann1k - Mi 29.12.10 10:53
Nein, da ist kein Denkfehler drin, Semaphoren dienen ja zum Synchronisieren von Prozessen, Deadlocks verhindern tun sie nicht. Mit ihnen kannst du Deadlocks aber erkennen und dann ggf beheben.
€: Dein spezielles Deadlock Szenario, kannst du in dem Fall aber lösen, indem du deinen Semaphor nicht negativ werden lässt, ist der Semaphor 0 blockiert der Prozess bei Wait, ansonsten wird der Semaphor um 1 verringert. Allerdings würde dann in deinem Beispiel kein Prozess schlafen gehen, ist wohl doch wichtig das Signal und Wait unteilbare Operationen sind.
Gausi - Mi 29.12.10 11:18
Ich schmeiß mal CriticalSection in die Runde. Ist ein Thread in einer Critical Section, kann kein anderer auch darein. Erst dann, wenn der erste Thread da wieder raus ist.
platzwart - Mi 29.12.10 13:42
Benutz doch einfach die Semaphore, die Delphi anbietet :roll: Semaphoren werden vom Betriebssystem verwendet, was nicht auf deine Objekte/Variablen zutrifft...
Bergmann89 - Mi 29.12.10 14:12
Hey,
ich hatte schonma gesucht, ob es da schon ne Lösung von Delphi gibt, aber bin nicht fündig geweorden. Hab jetzt
DAS [
http://edn.embarcadero.com/article/29908] gefunden. Das passt mir ganz gut in den Kram, da wird der Thread nicht komplett lahm gelegt und ich kann bei nem Timeout angemessen daruf reagieren.
MfG & Thx Bergmann.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!