Beispiele zu RingBuffer Implementierungen lassen sich ja finden wie Sand am Meer.
Nur ist bei mir der Spezialfall, dass der Buffer zwar nur von einem Produzent gefüllt wird, aber mehrere Leser darauf zugreifen, und zwar *muss* jeder Leser seinen eigenen Lesezeiger haben.
Das kann ja eigentlich nicht so schwierig sein, aber irgendwie steh ich auf dem Schlauch, wie ich das implementieren soll.
Bin dankbar für Denkanstösse.
Moin
Nur ist bei mir der Spezialfall, dass der Buffer zwar nur von
einem Produzent gefüllt wird, aber mehrere Leser darauf
zugreifen, und zwar *muss* jeder Leser seinen eigenen
Lesezeiger haben.
… nach dem ich-bin-faul-Prinzip:
Leg einen Ringbuffer pro Leser an. Lass den Produzenten eine Kopie in jede Liste legen. Wenn die Objekte sich nicht verändern und Threadsafe sind kannst du in alle Listen das gleiche Obekt legen. Ansonsten hilft dir clone() weiter.
cu
Hallo pumpkin
danke für deinen vorschlag.
was mir daran nicht gefällt ist, dass die applikation mal auf einem embedded board laufen soll, sprich ich habe mich mit beschränkten ressourcen zu beschäftigen…
die liste wird wahrscheinlich meistens um die 1000 einträge beinhalten.
aber wenn mir nichts besseres
einfällt, werde ich das wohl so machen.
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Moin, moin,
anderer Vorschlag:
RingBuffer: hält die Daten
RingBufferWriter: kann in einen RingBuffer schreiben und die Schreib-Zeiger verwalten
RingBufferReader: liest aus einem RingBuffer und die Lese-Zeiger verwalten
In RingBuffer gibt es nun zwei Methoden:
RingBufferWriter getWriter(): liefert genau eine Instanz
RingBufferReader getReader(): liefert für jeden Aufruf eine neue(!) Instanz
Damit wäre Dein Problem gelöst. Die Synchronisation läuft in RingBuffer (bzgl. Schreiben hat Vorrang vor Lesen, oder umgekehrt, …).
Zur Speicherproblematik:
Die Daten werden in genau einem Objekt gehalten.
Die Verwaltungsdaten (für die Zeiger) sind sehr gering und können daher ausgelagert werden.
Gruß,
Frank
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Moin, moin,
anderer Vorschlag:
RingBuffer: hält die Daten
RingBufferWriter: kann in einen RingBuffer schreiben und die
Schreib-Zeiger verwalten
RingBufferReader: liest aus einem RingBuffer und die
Lese-Zeiger verwalten
In RingBuffer gibt es nun zwei Methoden:
RingBufferWriter getWriter(): liefert genau eine Instanz
RingBufferReader getReader(): liefert für jeden Aufruf eine
neue(!) Instanz
Damit wäre Dein Problem gelöst. Die Synchronisation läuft in
RingBuffer (bzgl. Schreiben hat Vorrang vor Lesen, oder
umgekehrt, …).
Zur Speicherproblematik:
Die Daten werden in genau einem Objekt gehalten.
Die Verwaltungsdaten (für die Zeiger) sind sehr gering und
können daher ausgelagert werden.
Gruß,
Frank
Hallo Frank
gefällt mir sehr gut, dein vorschlag.
vielen dank!