![]() |
AtomicTypes - Atomare Boolean, Integer, Enum und Set Typen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
in C++ gibt es den
Delphi-Quellcode:
Typ, welcher mittels
std::atomic<T>
Delphi-Quellcode:
,
LOCK CXHG
Delphi-Quellcode:
,
LOCK INC
Delphi-Quellcode:
, etc. intrinsische atomare Operationen implementiert. Hierbei werden die Operatoren so überladen, dass sich Variablen dieses Typs ganz genau wie der generische Grundtyp verwenden lassen.
LOCK DEC
Leider sind in Delphi sowohl die
Delphi-Quellcode:
, 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
class operators
Delphi-Quellcode:
gesetzt werden.
.Assign
Beispiel:
Delphi-Quellcode:
Wer Interesse hat, kann ja mal reinschauen :stupid:
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; Aktuellste Version auch immer auf ![]() Viele Grüße Zacherl |
AW: AtomicTypes - Atomare Boolean, Integer, Enum und Set Typen
OT: Embarcadero sollte dich und Andreas Hausladen definitiv unter Vertrag nehmen. Ihr beiden würdet Delphi zu etwas machen, was es bis heute leider nicht ist.
|
AW: AtomicTypes - Atomare Boolean, Integer, Enum und Set Typen
Kannst du das Assign nicht einfach mit einem Implicit-Operator implementieren?
Delphi-Quellcode:
Edit: Besser gleich mit dem generischen Typ.
class operator TAtomicInteger<T>.Implicit(A: T): TAtomicInteger<T>;
begin Result.Assign(A); end; |
AW: AtomicTypes - Atomare Boolean, Integer, Enum und Set Typen
Zitat:
|
AW: AtomicTypes - Atomare Boolean, Integer, Enum und Set Typen
Für Idioten wie mich erklärt: was bringen diese atomaren ... Dinger?
|
AW: AtomicTypes - Atomare Boolean, Integer, Enum und Set Typen
Zitat:
Delphi-Quellcode:
,
TCriticalSection
Delphi-Quellcode:
, etc. absichern. Diese Locks sind von der Performance her nicht wirklich gut, da sie entweder Spin-Locken oder einen Context-Switch in den Kernel bewirken. Die atomaren Typen werden ohne zusätzlichen (Software-)Overhead direkt von der CPU synchronisiert und sind deshalb besonders performant. Allerdings hat dieser Mechanismus auch seine Grenzen, wie dass er z.b. nur für triviale Typen bis maximal 8-Byte anwendbar ist.
TMonitor
|
AW: AtomicTypes - Atomare Boolean, Integer, Enum und Set Typen
Sehr schade. Wäre super schön gewesen, wenn man diese Funktionalität ohne Assign und für komplexere Datentypen hätte.
Vielleicht ließt Emba das ja mit und stellt dich für diese Aufgabe [Ironie an]für Delphi 19.1[/Ironie aus] ein ;) |
AW: AtomicTypes - Atomare Boolean, Integer, Enum und Set Typen
Zitat:
Delphi-Quellcode:
zu verwenden. In diesem Falle wird dann intern allerdings wieder auf Critical-Sections, Mutexe, etc. zurückgegriffen, aber dennoch manchmal eine schöne Abstraktion.
std::atomic<T>
|
AW: AtomicTypes - Atomare Boolean, Integer, Enum und Set Typen
Zitat:
Deine ist auch gut keine Frage. Aber bei großen Projekten müsste man viel abändern. |
AW: AtomicTypes - Atomare Boolean, Integer, Enum und Set Typen
Zitat:
Ich hatte mir gewünscht, dass es auch Operatoren für Initialize, Copy und Finalize gibt. Es gibt bereits Funktionen in der System.pas dafür (Kopieren von Records/Arrays/Strings/Variants/Interfaces) und man müsste da nur noch den Aufruf dieser Operatoren dort einfügen. :cry: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz