Ich las Galvin OS Buch über Producer Consumer Problem und kam durch dieses Stück Code.Producer-Consumer-Algorithmus, um vollen Puffer zu verwenden
Globale Definitionen
#define BUFFER_SIZE 10
typedef struct {
. . .
} item;
int in = 0;
int out = 0;
Produzent
while (((in + 1) % BUFFER_SIZE) == out)
; /* do nothing */
buffer[in] = next_produced;
in = (in + 1) % BUFFER_SIZE ;
Consumer
while (in == out)
; /* do nothing */
next_consumed = buffer[out];
out = (out + 1) % BUFFER_SIZE;
Nun ist dies was Galvin Buch sagt:
Dieses Schema höchstens BUFFER_SIZE erlaubt - 1 Eintragungen im Puffer an den gleichzeitig. Wir überlassen es als Übung für Sie, eine Lösung bereitzustellen, in der BUFFER_SIZE-Elemente gleichzeitig im Puffer sein können.
Das ist, was ich gefunden habe. Ist das richtig?
Produzent
buffer[in] = next_produced; //JUST MOVED THIS LINE!
while (((in + 1) % BUFFER_SIZE) == out)
; /* do nothing */
in = (in + 1) % BUFFER_SIZE;
Consumer
while (in == out)
; /* do nothing */
next_consumed = buffer[out];
out = (out + 1) % BUFFER_SIZE;
Ich denke, dies löst, aber ist das richtig? Jede andere bessere Lösung möglich?
Willkommen bei SO. Was hat dein Testlauf dir gezeigt? SO ist keine Seite für die Code-Überprüfung, sondern für die Lösung _spezifischer_ Probleme. – Gerhardh
Es ist kein Codefehler. Es ist eine Frage über die Logik und den Algorithmus! Lesen Sie über Hersteller-Verbraucher-Problem! –
Ich kenne das Producer & Consumer Problem. Aber Sie geben kein spezifisches Problem an. Hast du es getestet? Erkennt Ihr Hersteller den leeren und vollen Puffer richtig und überschreibt vorhandene Einträge nicht? Erkennt Ihr Kunde den leeren Puffer richtig und liest die Werte in der richtigen Reihenfolge? Wenn Ihr Test fehlschlägt, können wir ein ** spezifisches ** Problem lösen. Oder Sie nennen einen bestimmten Zweifel, wo Sie denken, dass Sie falsch liegen. – Gerhardh