Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

Re: Interlocked* mit Operator Überladung

  Alt 8. Jan 2010, 16:15
Delphi-Quellcode:
class operator TThreadSafeInteger.Add(a: TThreadSafeInteger; b: Integer): Integer;
begin
  a.Value := a.Value + b; // sinnlos, da hier nur eine Kopie von a verändert wird
                           // und kein anderer darauf zugreifen kann
  result := a.Value; // lesezugriff
end;

class operator TThreadSafeInteger.Subtract(a: TThreadSafeInteger; b: Integer): Integer;
begin
  a.Value := a.Value - b; // siehe add
  result := a.Value; // lesezugriff
end;

class operator TThreadSafeInteger.Explicit(a: TThreadSafeInteger): Integer;
begin
  result := a.Value; // Lesezugriffe brauchen hier nicht geschützt werden,
                      // da es die Schreibzugriffe schon ausreichend machen
end;

class operator TThreadSafeInteger.Implicit(a: TThreadSafeInteger): Integer;
begin
  result, a.Value);
end;

class operator TThreadSafeInteger.Explicit(a: Integer): TThreadSafeInteger;
begin
  result.Value := a; // sinnloas, da Result intern eh won keinem Anderem
                      // gesetzt werden kann und die externe Zuweisung ist vollkommen ungeschützt
end;

class operator TThreadSafeInteger.Implicit(a: Integer): TThreadSafeInteger;
begin
  result.Value := a; // siehe vorher
end;
Fazit: hier ist garnichts geschützt, da alles nur intern abläuft und extern kein Schutz besteht.

Man benötigt vorallem bei den Schreibvorgängen direkten Zugriff auf die Variablen und das ist via Result nicht möglich.
$2B or not $2B
  Mit Zitat antworten Zitat