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