Autor |
Beitrag |
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Mi 29.12.10 10:43
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.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Jann1k
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: 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
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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.
_________________ We are, we were and will not be.
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Mi 29.12.10 13:42
Benutz doch einfach die Semaphore, die Delphi anbietet  Semaphoren werden vom Betriebssystem verwendet, was nicht auf deine Objekte/Variablen zutrifft...
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
Bergmann89 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: 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 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.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
|