Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Threads und Prozedur-Aufrufe im MainThread


CS - Fr 21.05.10 09:51
Titel: Threads und Prozedur-Aufrufe im MainThread
Hallo zusammen,

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


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:


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 - Fr 21.05.10 10: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 - Di 25.05.10 10:27

Hallo Tryer,

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

Grüße,

Christian