Klausur Februar 2014, mops.c

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Klausur Februar 2014, mops.c
Hallo,
ich bin etwas verwirrt wegen der Aufgabenstellung zur Aufgabe 2.
Da soll man ja einen Ringpuffer verwenden, der mit zählenden Semaphoren synchronisiert wird.
Muss man den Ringpuffer selbst implementieren (es ist im Programmgerüst nirgendwo vermerkt bzw. glaube ich auch nicht, dass genug Platz dafür wäre)
oder gibt es einen Standard-C-Ringpuffer, den man verwenden kann/sollte?
Die Semaphore muss man ja selbst implementieren, allerdings ist doch nicht genug Platz im Programmgerüst gelassen, um die struct SEM ordentlich zu beschreiben.
Auch hier die Frage, ob man da auf eine “C-inhärente” Semaphore zurückgreifen kann. Wenn ja, wie gebe ich die an?


Ja, muss man selbst implementieren.

Selbst implementieren.

Genug Platz ist für beides eigentlich vorhanden. Was willst du denn alles hinprogrammieren, um da in Platznot zu kommen?


Naja, also wenn ich mich an die Struktur halten möchte, die da mit Kommentaren vorgegeben ist, müsste ich ja den ringpuffer komplett am Anfang unter //weitere Includes, Konstanten usw. reinschreiben und dafür wird der Platz schon knapp.
Die struct SEM kann man schon in zwei Zeilen schreiben, der Rest von der sem.c ist bei mir ziemlich voll.
Ich find’s ein bisschen komisch, dass halt auch explizit da steht, dass man sem.c implementieren muss, aber über den Ringpuffer wird relativ wenig gesagt.


Ich glaub du verstehst die Angabe falsch, oder ich. Du musst keine struct hinschreiben, und du musst auch keine wiederverwendbare Datenstruktur Ringpuffer irgendwo hinzaubern. Du machst ein Array mit n Elementen, counter zum Zählen welche Elemente des arrays belegt sind, fertig ist der Ringpuffer?


Was sollte denn deiner Meinung nach noch mehr über den Ringpuffer gesagt werden?

Man benötigt nur die Standard-Zutaten für einen synchronisierten Ringpuffer:

  • ein Array fester Größe
  • einen Lese- und einen Schreibindex
  • zwei zählende Semaphore fürs Verhindern von Über- bzw. Unterläufen
  • (optional einen binären Semaphor zum blockierenden Synchronisieren der Leser, wenn man’s nicht per CAS lösen will)

Der ganze Schlonz mit Kapselung in ein extra Modul, Zusammenpacken in eine [m]struct[/m], Konstruktor und Destruktor etc., der es einem erlaubt, mehrere Ringpuffer-Exemplare anlegen, ist in dieser Aufgabe nicht notwendig. Es ist nicht einmal nötig, das Einfügen und das Rausnehmen in separate Funktionen auszulagern. Die vier (Einfügen) bzw. sechs Zeilen Code (Rausnehmen) schreibt man einfach da hin, wo sie gebraucht werden - quasi als manuelles Inlining. :slight_smile:


Ach so, ja dann passt das natürlich :wink: