Hallo zusammen,
in C++ gibt es den
std::atomic<T>
Typ, welcher mittels
LOCK CXHG
,
LOCK INC
,
LOCK DEC
, etc. intrinsische atomare Operationen implementiert. Hierbei werden die Operatoren so überladen, dass sich Variablen dieses Typs ganz genau wie der generische Grundtyp verwenden lassen.
Leider sind in Delphi sowohl die
class operators
, als auch die Generics im Vergleich zu C++ stark beschränkt, aber ich habe mich dennoch mal daran versucht entsprechende Typen nachzubilden. Statt einigen 100 Zeilen wurden hieraus dann leider mehrere 1000 Zeilen mit viel repetitivem Code. Zudem gibt es eine recht große Limitierung, bedingt dadurch, dass Delphi das Überladen des Assignment Operators nicht unterstützt. Neue Werte können nicht einfach zugewiesen werden, sondern müssen mit
.Assign
gesetzt werden.
Beispiel:
Delphi-Quellcode:
var
I, J: TAtomicInt32;
V: Integer;
D: Double;
begin
// Atomic writes
I.Assign(42); // I = 42
J.Assign(24); // J = 24
V := J.Exchange(-1); // V = 24, J = -1
J.Inc; // J = 0
J.Sub(1); // J = -1
// We can use the atomic type just like a "normal" integer
V := I + J; // V = 41
D := I / 4; // D = 10.5
// DON'T DO THIS! Not atomic!
I := J;
Wer Interesse hat, kann ja mal reinschauen
Aktuellste Version auch immer auf GitHub.
Viele Grüße
Zacherl