AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke TThreadedQueue vs ThreadedRingBuffer

TThreadedQueue vs ThreadedRingBuffer

Ein Thema von QuickAndDirty · begonnen am 3. Feb 2025 · letzter Beitrag vom 4. Feb 2025
Antwort Antwort
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.966 Beiträge
 
Delphi 12 Athens
 
#1

TThreadedQueue vs ThreadedRingBuffer

  Alt 3. Feb 2025, 12:39
TThreadedQueue aus System.Generics.Collections
Führt bei jedem PushItem oder PopItem sowas hier durch
Delphi-Quellcode:
  TMonitor.Enter(FQueueLock); // ALLES WIRD GELOCKT
  try
    Result := wrSignaled;
    while (Result = wrSignaled) and (FQueueSize = Length(FQueue)) and not FShutDown do
      if not TMonitor.Wait(FQueueNotFull, FQueueLock, FPushTimeout) then
        Result := wrTimeout;

    if FShutDown or (Result <> wrSignaled) then
      Exit;

    FQueue[(FQueueOffset + FQueueSize) mod Length(FQueue)] := AItem;
    Inc(FQueueSize);
    Inc(FTotalItemsPushed);

  finally
    AQueueSize := FQueueSize;
    TMonitor.Exit(FQueueLock);
  end;

  TMonitor.Pulse(FQueueNotEmpty);
Wenn ich Queue als Ringpuffer umsetzen würde , müsste ich dann immer noch beides LOCKEN also READ und WRITE oder kann ich READ während des WRITE ungelockt lassen ?

Edit:
Ich sehe gerade DASS es sich bei TThreadedQueue um einen Ringbuffer handelt.
Warum wird jedesmal alles gelockt?
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 3. Feb 2025 um 12:57 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.147 Beiträge
 
Delphi 12 Athens
 
#2

AW: TThreadedQueue vs ThreadedRingBuffer

  Alt 3. Feb 2025, 15:51
Edit:
Ich sehe gerade DASS es sich bei TThreadedQueue um einen Ringbuffer handelt.
Warum wird jedesmal alles gelockt?
Ohne mir das angesehen zu haben, wie kommst Du darauf , dass eine Queue ein Ringbuffer ist?

Ich denke das Queue hat eine variable Größe/Kapazität, worauf auch diese Zeile hindeutet:
Inc(FQueueSize);
Bei einem Ringbuffer sollte es meiner Meinung nach eine feste Kapazität geben, die sich nicht vergrößert/verkleinert,
sondern überschrieben werden, wenn es über die Kapazität hinausgeht.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.966 Beiträge
 
Delphi 12 Athens
 
#3

AW: TThreadedQueue vs ThreadedRingBuffer

  Alt 3. Feb 2025, 17:47
Es ist ein Ringpuffer
FqueueSize minus fqueueOffset Ist die Länge der Schlange im Ringpuffer. FQueueSize hat vielleicht nicht ganz den richtigen Bezeichner! Length(FQueue) ist die größe des Ringpuffers.
FQueue ist ein Array = Der Puffer.
Der Schreib-Index des Ringpuffers wird wie folgt ermittelt
Code:
(FQueueOffset + FQueueSize) mod Length(FQueue)
FQueueSize modulo 10
ergibt indizes 0..9 in einem RING
FQueueSize = 1401
würde einen index 1 ergeben da 1401 modulo 10 gleich 1 ist!

man kann FQueueSize einfach immer hochzählen solange man den index über modulo ermittelt.
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 3. Feb 2025 um 17:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.272 Beiträge
 
Delphi 12 Athens
 
#4

AW: TThreadedQueue vs ThreadedRingBuffer

  Alt 3. Feb 2025, 18:02
Queue = FIFO (first in, first out)
Stack = LIFO (last in, first out)

Also ja Queue gleich entsprechend RingBuffer ... praktisch das gleiche Verhalten, also es unterscheidet sich nur die interne Speicherverwaltung.

Und da die TThreaded-Komponenten ja selbst das Threadsichere handhaben, kann man da meistens direkt auf Add/Remove/Push/Pop/... zugreifen, weil sie intern sich selbst absichern (wenn diese Methoden direkt oben public erreichbar sind)


Als Ringbuffer oder verkettete Liste hat es halt den Vorteil, dass beim Reinschieben oder Rausholen nicht der gesamte Listeninhalt verschoben werden muß.
(beim Stack geht ist Beides immer am Listenende und somit verschieben sich die vorherrigen Einträge nicht)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 3. Feb 2025 um 18:41 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.147 Beiträge
 
Delphi 12 Athens
 
#5

AW: TThreadedQueue vs ThreadedRingBuffer

  Alt 3. Feb 2025, 18:51
Als Ringbuffer oder verkettete Liste hat es halt den Vorteil, dass beim Reinschieben oder Rausholen nicht der gesamte Listeninhalt verschoben werden muß.
Genau, der RingBuffer, so wie ich ihn verstehe, muss nur einmal seine Speicher-Kapazität allozieren und zeigt dann quasi nur mit Start- und Ende-Pointern auf den entsprechenden Abschnitt in seinem gesamten Speicherbereich, was den Zugriff theoretisch viel effizienter machen sollte, weil nie etwas hin- und herkopiert wird.
Dafür kann es aber auch einen Überlauf geben.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.966 Beiträge
 
Delphi 12 Athens
 
#6

AW: TThreadedQueue vs ThreadedRingBuffer

  Alt 4. Feb 2025, 10:10
Genau, der RingBuffer, so wie ich ihn verstehe, muss nur einmal seine Speicher-Kapazität allozieren und zeigt dann quasi nur mit Start- und Ende-Pointern auf den entsprechenden Abschnitt in seinem gesamten Speicherbereich, was den Zugriff theoretisch viel effizienter machen sollte, weil nie etwas hin- und herkopiert wird.
Dafür kann es aber auch einen Überlauf geben.
TThreadedQueue macht das genau so.
Intern speichert es einen ReadPointer "FQueueOffset mod length(fQueue)" in form eines index auf ein Array und einen WritePointer "(FQueueOffset + fQueSize) mod length(fQueue)" ebenfalls als index auf das Array fQueue.

Und da die TThreaded-Komponenten ja selbst das Threadsichere handhaben, kann man da meistens direkt auf Add/Remove/Push/Pop/... zugreifen, weil sie intern sich selbst absichern (wenn diese Methoden direkt oben public erreichbar sind)
Ich hatte halt nur irgendwie gehofft dass ein Ringspecher ohne Vollsperrung für threadsicherheit auskommen würde.
Vermutlich müsste es dafür ein Ringspeicher auf Basis einer Verkettetenliste sein?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.036 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

AW: TThreadedQueue vs ThreadedRingBuffer

  Alt 4. Feb 2025, 13:52
Warum wird jedesmal alles gelockt?
Weil die RTL Entwickler wenig bis keine Erfahrung haben, lockfreie Datenstrukturen zu designen und zu implementieren.
Und das meine ich ausnahmsweise mal nicht despektierlich, das ist nämlich wirklich kein Zuckerschlecken sonst hätt ich sowas auch in Spring4D, aber davon lass ich lieber die Finger
Wenn du sowas benötigst, solltest du dich eher bei externen Bibliotheken umschauen, z.B. der OTL.

Übrigens, lockfrei ist auch nicht wirklich der heilige Gral, da gibt es noch weit mehr zu berücksichtigen.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 4. Feb 2025 um 13:55 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.966 Beiträge
 
Delphi 12 Athens
 
#8

AW: TThreadedQueue vs ThreadedRingBuffer

  Alt 4. Feb 2025, 17:21
Ich habe drüber nachgedacht...
um es semi-Lockfrei zu halten müsste ich dafür sorgen das im Ringpuffer immer mindestesens zwei Einträge sind...also auch im leeren Ringpuffer müssten 2 dummy einträge sein...
Und dann könnte ich lesen und schreiben unabhängig von einander Locken... nur so zur sicherheit...aber das wäre effektiv so dass kein thread je auf das unlock warten müsste (Waitfree)...es sei denn es läuft etwas schief.
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 4. Feb 2025 um 17:24 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.966 Beiträge
 
Delphi 12 Athens
 
#9

AW: TThreadedQueue vs ThreadedRingBuffer

  Alt 4. Feb 2025, 18:21
Wenn du sowas benötigst, solltest du dich eher bei externen Bibliotheken umschauen, z.B. der OTL.
Oh je.
Ist es das hier?

https://github.com/gabr42/OmniThread...kFreeQueue.pas

Verstehst du das?

Edit:
OK es gibt hier eine Erklärung
https://www.thedelphigeek.com/2010/0...-it-right.html
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 4. Feb 2025 um 18:30 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 11:38 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