Autor Beitrag
CS
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 21.05.10 10:51 
Hallo zusammen,

ich habe ein kleines Verständnisproblem, was Threads und TCriticalSections angeht. Ich habe folgende Situation (in Pseudocode):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
TMainClass = class(TObject)
  private
    critSec : TCriticalSection;
  public  
    procedure doSomething;
end;

TMyThread = class(TThread)
  private
     critSec : TCriticalSection;
  public
     constructor create(cs : TCriticalSection);
     procedure execute;
end;


Der Konstruktor des Threads wird mit der CriticalSection der Hauptklasse aufgerufen, der Private-Member wird auf die übergebene CriticalSection gesetzt. Nun sind die Execute und die DoSomething-Methode wie folgt implementiert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TMyThread.execute;
Begin
  while NOT self.terminated do begin
    try
      critSec.Enter;
      MainClass.doSomething;
    finally
      critSec.leave;
    end;
  end;
End;

procedure TMainClass.DoSomething;
Begin
  try
    critSec.Enter;
    someCode;
  finally
    critSec.Leave;
  end;
End;


Es wird also, wenn mich mein Verständnis hier nicht täuscht, die gleiche CriticalSection "innerhalb" ihrerselbst aufgerufen. Das sollte doch zum Deadlock führen! Tut es aber nicht. Kann mir jemand erklären, warum das so ist?

Grüße,

Christian
Tryer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: Fr 21.05.10 11:08 
Du must nur erkennen das "wo der Code steht" und "in welchem Thread er ausgeführt wird" nichts miteinander zu tun hat.
Wenn der Thread "DoSomething" aufruft, dann wird das im Kontext des Threads ausgeführt - und da der die CriticalSection schon in Beschlag hat stört der "doppelte" Aufruf nicht.

Grüsse, Dirk

[EDIT] Ein Deadlock träte dann auf, wenn der Thread Synchronize(DoSomething) aufrufen würde. Das synchronize sorgt dafür das DoSomething dann im "Hauptthread" ausgeführt wird. Dann wartet der Thread (im Besitz der CriticalSection) darauf das der Hauptthread fertig wird, und der Hauptthread wartet darauf das er an die CriticalSection kommt - und nix geht mehr.
CS Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 25.05.10 11:27 
Hallo Tryer,

Danke für die Antwort. Da wird mir dann doch so einiges klar.

Grüße,

Christian