Einzelnen Beitrag anzeigen

Win32.API

Registriert seit: 23. Mai 2005
312 Beiträge
 
#1

Interlocked* mit Operator Überladung

  Alt 8. Jan 2010, 16:04
Hallo,

ist das Ganze so Threadsafe, oder koennte es Probleme geben?

Delphi-Quellcode:
type
  TThreadSafeInteger = record
  private
    Value: Integer;
  public
    class operator Add(a: TThreadSafeInteger; b: Integer): Integer;
    class operator Subtract(a: TThreadSafeInteger; b: Integer): Integer;
    class operator Implicit(a: TThreadSafeInteger): Integer;
    class operator Implicit(a: Integer): TThreadSafeInteger;
    class operator Explicit(a: TThreadSafeInteger): Integer;
    class operator Explicit(a: Integer): TThreadSafeInteger;
  end;

implementation

{ TThreadSafeInteger }

class operator TThreadSafeInteger.Add(a: TThreadSafeInteger; b: Integer): Integer;
begin
  InterlockedExchangeAdd(a.Value, b);
  InterlockedExchange(result, a.Value);
end;

class operator TThreadSafeInteger.Subtract(a: TThreadSafeInteger; b: Integer): Integer;
begin
  InterlockedExchangeAdd(a.Value, -b);
  InterlockedExchange(result, a.Value);
end;

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

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

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

class operator TThreadSafeInteger.Implicit(a: Integer): TThreadSafeInteger;
begin
  InterlockedExchange(result.Value, a);
end;
Grüße, Win32.API
  Mit Zitat antworten Zitat