Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Ringpuffer Bibliothek veröffentlicht (https://www.delphipraxis.net/205297-ringpuffer-bibliothek-veroeffentlicht.html)

Sinspin 4. Jan 2022 10:26

AW: Ringpuffer Bibliothek veröffentlicht
 
Zitat:

Zitat von Stevie (Beitrag 1500039)
Im Idealfall sollte ein thread-safer Ringbuffer lock-free sein und nicht einfach stumpf ne CS oder sowas nutzen.

Ich denke ab mehr als einem Thread, der Daten schreibt oder liest wird es sich nicht vermeiden lassen mit CS zu arbeiten. Zumindest bei jedem schreibenden Zugriff auf die Positionszeiger.
Aber selbst dann können sich Fehler ergeben wenn ein Positionszeiger von mehr als einem Thread zur gleichen Zeit gelesen wird, dann würden all diese Threads auf die gleichen Datenzelle lesend oder schreibend zugreifen.
Ich kann mir nicht vorstellen wie man das ohne CS lösen kann.

Rollo62 4. Jan 2022 10:36

AW: Ringpuffer Bibliothek veröffentlicht
 
Zitat:

Zitat von TurboMagic (Beitrag 1500040)
Zitat:

Zitat von Stevie (Beitrag 1500039)
Im Idealfall sollte ein thread-safer Ringbuffer lock-free sein und nicht einfach stumpf ne CS oder sowas nutzen.

Ich verstehe nur noch nicht ganz, wie man das umsetzen könnte?

Das könnte vielleicht mit viel Interlocked Pointer-Einsatz gehen, würde ich mal vermuten.
https://ferrous-systems.com/blog/lock-free-ring-buffer/

Aber das wäre dann sicher schon die nächste Ausbaustufe des RingBuffers.

TurboMagic 4. Jan 2022 11:12

AW: Ringpuffer Bibliothek veröffentlicht
 
Wie gesagt: der Autor der Bibliothek ist offen für Code Beiträge ;-)

Stevie 4. Jan 2022 12:20

AW: Ringpuffer Bibliothek veröffentlicht
 
AFAIK hat die OTL sowas schon

TurboMagic 7. Jan 2022 16:05

AW: Ringpuffer Bibliothek veröffentlicht
 
Zitat:

Zitat von Rollo62 (Beitrag 1500055)
Zitat:

Zitat von TurboMagic (Beitrag 1500040)
Zitat:

Zitat von Stevie (Beitrag 1500039)
Im Idealfall sollte ein thread-safer Ringbuffer lock-free sein und nicht einfach stumpf ne CS oder sowas nutzen.

Ich verstehe nur noch nicht ganz, wie man das umsetzen könnte?

Das könnte vielleicht mit viel Interlocked Pointer-Einsatz gehen, würde ich mal vermuten.
https://ferrous-systems.com/blog/lock-free-ring-buffer/

Aber das wäre dann sicher schon die nächste Ausbaustufe des RingBuffers.

Und, welchen Ansatz benutzt du nun?

Grüße
TurboMagic

Rollo62 8. Jan 2022 10:10

AW: Ringpuffer Bibliothek veröffentlicht
 
Zitat:

Zitat von TurboMagic (Beitrag 1500234)
Und, welchen Ansatz benutzt du nun?

Wie schon gesagt, basierend auf TMemoryStream, mit Interlocked Pointern und Flags zur möglichst effizienten Kontrolle der aktuellen Start/End Pointer, und zur Minimierung von echten CriticalSections.
Ich brauche das im Moment um zufällig eingehende TBytes Sendungen mit variabler Länge, von regelmäßigen Bearbeitungen , welche diese TBytes Daten abholen und verarbeiten sicher zu entkoppeln.
Also es kann gerade etwas abgeholt werden, wenn zufällig neue Daten reinkommen, das muss abgesichert werden.
Das basiert allerdings auf linearen Speicher und ist auf Byte-Stream-Weise Ein- und Ausgabe optimiert,
also ist es mit dem universellen Ringbuffer in dem man Alles reinwerfen kann nicht ganz kompatibel.
( Oder zumindest wäre ein direkter Vergleich etwas unfair ).

Ich könnte auch einen FIFO-artigen, linearen Speicher dafür nehmen, müsste dann aber verhindern dass der unendlich anwächst, deshalb hatte ich RingBuffer eingesetzt.
In meinem Fall wäre das aber sicher auch mit einem längenbegrentzen FIFO möglich,
vom RingBuffer erhoffe ich mir allerdings unnötiges Umkopieren/Löschen von Bytes zu verhindern.
Ein Ringbuffer muss ja nicht entsorgt werden, sondern der StartPointer (Integer) läuft einfach bis zum EntPointer (Integer), und die alten Daten bleiben einfach unangetastet im Ring, das kostet fast gar nichts.

Trotzdem checke ich immer mal wieder wie sich Alternativen dazu verhalten und ob es gute Ideen dazu gibt.

Uwe Raabe 8. Jan 2022 10:44

AW: Ringpuffer Bibliothek veröffentlicht
 
Zitat:

Zitat von Rollo62 (Beitrag 1500259)
und die alten Daten bleiben einfach unangetastet im Ring

Das geht auch nur solange gut, bis der generische Ringbuffer mit Managed Types verwendet wird. Dann muss beim Entfernen eventuell schon was mit den alten Daten passieren (z.B. Interfaces auf nil setzen). Das bedeutet manchmal eben auch Schreibzugriffe auf den Bufferspeicher zusätzlich zu den Pointern mit allem was es bei Multithreading dabei zu beachten gibt. Generics sind halt nicht trivial und verursachen oft einen ziemlichen Overhead, der bei simplen Typen zwar redundant ist, aber nicht immer so leicht wegoptimiert werden kann.

Rollo62 8. Jan 2022 12:19

AW: Ringpuffer Bibliothek veröffentlicht
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1500264)
Zitat:

Zitat von Rollo62 (Beitrag 1500259)
und die alten Daten bleiben einfach unangetastet im Ring

Das geht auch nur solange gut, bis der generische Ringbuffer mit Managed Types verwendet wird.

Genau, ich rede ja auch nur von meiner Anwendung, mit reinen TBytes Streams.
Dass der universelle RingBuffer so nicht optimiert werden kann ist klar.
Deshalb schreibe ich ja dass ein Vergleich mit Äpfeln und Birnen etwas unfair ist :stupid:

mytbo 22. Jan 2022 19:18

AW: Ringpuffer Bibliothek veröffentlicht
 
Zitat:

Zitat von TurboMagic (Beitrag 1500234)
Und, welchen Ansatz benutzt du nun?

Vielleicht liefert dir dieser Blog Artikel und die weiterführenden Links zusätzliche Inspiration: Three Locks To Rule Them All.

Bis bald...
Thomas

TurboMagic 23. Jan 2022 08:48

AW: Ringpuffer Bibliothek veröffentlicht
 
Zitat:

Zitat von mytbo (Beitrag 1501051)
Zitat:

Zitat von TurboMagic (Beitrag 1500234)
Und, welchen Ansatz benutzt du nun?

Vielleicht liefert dir dieser Blog Artikel und die weiterführenden Links zusätzliche Inspiration: Three Locks To Rule Them All.

Bis bald...
Thomas

Danke für den Link. Du darfst so einenen Lock Mechanismus gerne inform einer Kindklasse beitragen. Ich freue mich über von anderen beigesteuerte Code Erweiterungen, gerne auch ersmal in einem eigenen branch auf GitHub.

Grüße
TurboMagic


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:36 Uhr.
Seite 4 von 4   « Erste     234   

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-2025 by Thomas Breitkreuz