Zitat:
Delphi-Quellcode:
function TMyThreadA.CS : TCriticalSection;
begin
if not Assigned( _CS )
then
_CS := TCriticalSection.Create;
Result := _CS;
end;
CS ist nicht threadsave, denn wenn zwei Threads diese Funktion zum ersten Mal (wärend _CS noch nil ist) gleichzeitig aufrufen, dann gibt es da eventuell zwei Problemchen.
> es können mehrere TCriticalSection erstellt werden
= Speicherleck
= die direkten nachfolgenden Aufrufe wären nicht geschützt, da sie CriticalSections nutzen würden.
= es würde zu einem Deadlock kommen *1
1) CS.Enter würde eventuell, beim Erstellen, unterschiedliche CriticalSections,
aber CS.Leave würde richtig funktionieren und es würden dann einige Leaves auf eine falsche CS zeigen, was die Sperr-Zählung schrottet.
Lösung:
Erstell die CS schon im Constructor, denn der ist immer threadsave, Dank des Highlanderprinzips.
Wenn sie unbeding erst in dieser Funktion erstellt werden soll, dann sag Bescheid und gib mir ein Minütchen.