Ich werde ein Programm implementieren, wo ein Elternprozess eine Textdatei liest und die Daten, die er liest, in einen gemeinsamen Speicherpuffer einspeist, der von einigen untergeordneten Prozessen gelesen wird. All diese Arbeit wird durch Semaphoren vermittelt. Angenommen, das übergeordnete Element liest jeweils ein Zeichen aus der Datei und der Puffer für gemeinsam genutzte Speicher enthält 5 Steckplätze.Producer/Consumers problem
Zuerst dachte ich nur 2 Semaphore mit:
writeSemaphore
, bis 5 initialisiert, die Semaphore ist, die in den Puffer zu schreiben, ist der Schreiber erlaubt sagt, ob. Wenn es schließlich auf 0 geht, wird der Elternprozess blockiert, bis einer der Kinder ihn entsperrt (nachdem er einen Block gelesen hat).
readSemaphore
, initialisiert auf 0, ist der Semaphor, der angibt, ob einer der Leser aus dem Puffer lesen darf.
Aber jetzt, wo ich daran denke, würde dies mich nicht daran hindern, dass zwei Verbraucher gleichzeitig auf den gemeinsamen Speicher zugreifen. Ich muss es verhindern. Also habe ich einen dritten Semaphor eingeführt:
allowedToRead
das ist entweder 1 oder 0, das den Zugriff auf die untergeordneten Prozesse erlaubt oder blockiert.
Hier ist Pseudo-Code für Kinder und Eltern:
Kind:
while (something) {
wait(readSemaphore)
wait(allowedToRead)
<<read from shared memory>>
post(allowedToRead)
post(writeSemaphore)
}
Parent:
while (something) {
wait(writeSemaphore)
<<writes to shared memory>>
post(allowedToRead)
}
Ist meine Argumentation richtig?
Dank
Sie könnten Boost.Interprocess nützlich finden, um Ihnen einiges an Schwerstarbeit beim Umgang mit gemeinsam genutztem Speicher zu ersparen. Es gibt direkte Prozess-zu-Prozess-Streaming-Konstrukte, die hier beschrieben sind: http://www.boost.org/doc/libs/1_45_0/doc/html/interprocess/streams.html –
Dies ist für die Schule, also kein Boost für mich. –