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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!