Früher gab es
InterlockedCompareExchange bzw.
InterlockedCompareExchangePtr,
das kapselte Delphi dann mal als
TInterlocked,
aber man darf auch gern das neuere multi-platforme
AtomicCmpExchange der System-
Unit verwenden, mit bissl compilermagic bei der Typenbehandlung
Jo, schauen ob leer,
wenn ja, dann erstellen,
die Referenz threadsicher eintragen/austauschen, was mit einer
atomaren Operation am Einfachsten geht (Inter
locked,
Atomic oder
LOCK im Assembler)
und wenn nicht erfolgreich, dann die Instanz wieder freigeben. (falls ein anderer Thread das gleichzeitig gemacht hatte und schneller war)
Delphi-Quellcode:
if not Assigned(XXX) then begin
NEW := TIrgendwas.Create;
if AtomicCmpExchange(XXX, NEW, nil) <> nil then
NEW.Free;
end;
XXX.DoSomething;