AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte AtomicTypes - Atomare Boolean, Integer, Enum und Set Typen
Thema durchsuchen
Ansicht
Themen-Optionen

AtomicTypes - Atomare Boolean, Integer, Enum und Set Typen

Ein Thema von Zacherl · begonnen am 31. Dez 2017 · letzter Beitrag vom 1. Jan 2018
Antwort Antwort
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

AtomicTypes - Atomare Boolean, Integer, Enum und Set Typen

  Alt 31. Dez 2017, 16:20
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
Angehängte Dateien
Dateityp: pas Utils.AtomicTypes.pas (87,5 KB, 20x aufgerufen)
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (31. Dez 2017 um 16:22 Uhr)
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: AtomicTypes - Atomare Boolean, Integer, Enum und Set Typen

  Alt 31. Dez 2017, 16:45
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.609 Beiträge
 
Delphi 12 Athens
 
#3

AW: AtomicTypes - Atomare Boolean, Integer, Enum und Set Typen

  Alt 31. Dez 2017, 17:13
Kannst du das Assign nicht einfach mit einem Implicit-Operator implementieren?
Delphi-Quellcode:
class operator TAtomicInteger<T>.Implicit(A: T): TAtomicInteger<T>;
begin
  Result.Assign(A);
end;
Edit: Besser gleich mit dem generischen Typ.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming

Geändert von Uwe Raabe (31. Dez 2017 um 17:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: AtomicTypes - Atomare Boolean, Integer, Enum und Set Typen

  Alt 31. Dez 2017, 17:16
Kannst du das Assign nicht einfach mit einem Implicit-Operator implementieren?
Delphi-Quellcode:
class operator TAtomicInteger<T>.Implicit(A: Integer): TAtomicInteger<T>;
begin
  Result.Assign(A);
end;
Leider nein. Das Problem hierbei ist, dass Delphi beim Zuweisen eine neue temporäre RValue erstellt. Result liegt praktisch an einer komplett neuen Adresse auf dem Stack - würde dann zwar atomar zugewiesen (was natürlich sinnlos ist) - und dann nicht atomar der vorhandenen LValue zugewiesen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: AtomicTypes - Atomare Boolean, Integer, Enum und Set Typen

  Alt 31. Dez 2017, 17:29
Für Idioten wie mich erklärt: was bringen diese atomaren ... Dinger?
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: AtomicTypes - Atomare Boolean, Integer, Enum und Set Typen

  Alt 31. Dez 2017, 17:59
Für Idioten wie mich erklärt: was bringen diese atomaren ... Dinger?
Wenn mehrere Threads auf die gleiche Variable zugreifen, musst du konkurrierende Zugriffe normalerweise ja per TCriticalSection , TMonitor , 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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 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