2009-06-04 1 views
0

Nehmen wir an, ich habe zwei Puffer. Der Produzent füllt den Puffer # 1 und füllt dann den Puffer # 2. Der Verbraucher konsumiert einen Puffer pro Zeit, und es ist sehr langsam. Während es Puffer # 1 verbraucht, ist der Hersteller bereit, einen weiteren Puffer zu füllen , aber sie sind alle voll, und der Verbraucher hat noch nicht fertig mit # 1. Also, der Produzent wartet.Einfaches Producer-Consumer-Problem, aber der Hersteller aktualisiert die alten Puffer

Anstatt zu warten, möchte ich, dass der Hersteller den "freien" Puffer aktualisiert. Das heißt, während der Verbraucher Puffer # 1 verbraucht, sollte der Hersteller neue Daten in Puffer # 2 schreiben, sobald er bereit ist (die "alten" Daten werden überschrieben und verloren). Wenn der Verbraucher noch nicht mit # 1 abgeschlossen hat und der Produzent mehr Daten zum Schreiben hat, sollte er erneut schreiben auf # 2, und so weiter. Wenn der Konsument schließlich alle Daten in # 1 verbraucht, sollte er sofort beginnen, die frisch geschriebenen Daten in Puffer # 2, , zu verbrauchen und der Hersteller sollte weiterhin # 1 aktualisieren.

(stellen Sie sich vor, der Hersteller Video Frames in Echtzeit mit hoher Geschwindigkeit zu erwerben, während der Verbraucher langsam sie ausarbeitet; der Verbraucher nichts dagegen, wenn es einige Frame überspringt, aber es muss immer das letzte Bild verarbeitet Producer, kann stattdessen nicht verlangsamen noch warten, weil es jeden Frame erwerben muss).

Gibt es eine Möglichkeit, solche Dinge mit Semaphoren zu tun? Ist es ein bekanntes Nebenläufigkeitsproblem? ? Und, falls es möglich ist, dieses Problem auf n> 2 Puffer zu erweitern, ?

Danke!

Antwort

0

Nun, Sie könnten nur einen Puffer (Warteschlange) von Puffern haben. Eine Art von synchronisierter Warteschlangenstruktur, um zu ermitteln, welche Puffer verwendet werden. Dies würde für n> = 2 Puffer funktionieren.

Ich denke, es würde so funktionieren: Producer beginnt zu schreiben Puffer 1, aber nicht aus der Warteschlange entfernt. Der Verbraucher beginnt mit dem Verbrauch aus Puffer 1 und entfernt ihn aus der Warteschlange. Sobald der Puffer 1 voll ist, überprüft der Erzeuger die Warteschlange, um zu sehen, welche Puffer verfügbar sind, und er sieht, dass nur Puffer 2 verfügbar ist. Der Produzent beginnt mit Schreiben in Puffer 2. Wenn der Puffer 2 voll ist, überprüft er die Warteschlange erneut und sieht, dass Puffer 2 noch verfügbar ist, so dass er erneut darauf schreibt. Sobald der Verbraucher mit dem Puffer 1 fertig ist, wird er den Puffer 2 aus der Warteschlange entfernen und den Puffer 1 zurückstellen. Sobald der Produzent mit 2 fertig ist, wird nur noch Puffer 1 verfügbar sein und mit dem Schreiben beginnen. Ich hoffe, das hast du beschrieben. (Ich mag es nicht, nur mit Semaphoren zu arbeiten, ich bevorzuge es, höhere Datenstrukturen zu verwenden, zB Warteschlangen).

Um mit mehreren Produzenten zu arbeiten, führen Sie eine andere Warteschlange ein, um festzustellen, welche Puffer von einem Hersteller verwendet werden. So, jetzt haben Sie eine Producer Queue und eine Consumer Queue, und ich denke, dass alle Ihre Situationen behandelt werden.

+0

Unglücklicherweise brauche ich die Lösung auch für den Fall n = 2 Puffer (wenn die Puffer sehr groß sind und der Speicher nicht ist, könnte ich gezwungen sein, nur zwei Puffer zu verwenden, auf Kosten der Verbrauchergeschwindigkeit). – janesconference

+0

Ich habe einige Änderungen hinzugefügt, die helfen könnten. – CookieOfFortune

Verwandte Themen