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; //pausiert den aktiven Thread und übernimmt in in die Warteschlange
end;

procedure TSemaphor.Signal;
begin
  inc(fCount);
  if fCount <= 0 then
    ResumeThread;  //weckt einen Thread aus der Warteschlange auf
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.