Autor Beitrag
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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

ausblenden 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.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: 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...

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
Bergmann89 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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^^