Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by himitsu,
26. Nov 2011
function TMyThreadA.CS: TCriticalSection;
var
Comp: TCriticalSection;
begin
Result := _CS;
if not Assigned(Result) then begin
Result := TCriticalSection.Create;
Comp := InterlockedCompareExchangePointer(Pointer(_CS), Pointer(Result), nil);
if Assigned(Comp) then begin
Result.Free;
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by himitsu,
26. Nov 2011
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...