Klausurvorbereitung

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.

Klausurvorbereitung
und wie schauts aus? wie weit seid ihr inzwischen???


Ich fang morgen früh an. Erstmal die Vorlesungsfolien durchlesen und dann die Übungen + etwas Haskell.


hab vorhin angefangen bin bis kapitel5 gekommen. Bin nur froh, dass Detailwissen im Gegensatz zu konzmod und prätech hier nicht so wichtig ist. Auf das meiste kommt man eh mit nem funktionierendem Kleinhirn. :smiley:


ich finde die Altklausuren machbar… würde mich echt freuen wenn unsere in der Schwierigkeitsgrad sein würde.
wer war in der Klausurvorbereitungsstunde? hab sie leider verpassen müssen… was habt ihr da gemacht?


soviel ich weiß wurde eine Klausur durchgerechnet (war aber selbst nicht da, also nur Hörensagen)


haben die Februar-Klausur besprochen.


Hat jemand eine (Muster-)lösung für die beiden Schreibtischlaufaufgaben? Also jeweils Aufgabe 4 der beiden bisherigen Klausuren. Bin mir da noch ziemlich unsicher und würd gern mal vergleichen.


Also in der Übung haben wir eine Klausur besprochen (weiß aber nicht mehr welche)

Hier mal die Lösungen für die 4:

a) 4, 2, 5
b) 5,1,4
c) 5<4, 2<1, 5<1
(letzteres, wenn nur b sichtbar und a nicht sichtbar nach überschreiben)
d) t1: immer 4<5
t2: 5<4, 2<1, 5<1, 2<4
=> insgesamt 8 Stück (4*2 weil in umgedrehter Reihenfolge auch noch)
e) 5<1 fällt raus => 6 Stück
f) 8 Stück, da jeder Thread um sich selbst synchronisiert!

Hab keine Ahnung was die Aufgabe war, hab hier nur die Lösung, also einfach nochmal was sagen, wenn’s doch die falsche Aufgabe war :wink:


Mal ne Frage zu genau dieser Aufgabe, man nimmt da an, dass der Compiler keine Befehle vertauscht oder? Denn ansonsten könnte 5<1 in Aufgabe e) ja trotzdem drankommen, wenn der erste Thread zuerst b ändert, und dann der zweite komplett durchläuft.


Sofern die e), das mit dem volatile war:
Sobald die Variablen volatile sind, wird die Zuweisung vom Compiler nicht mehr vertauscht. (Aussage: Übungstyp, und glaub ich Java-spezifisch)


Ja, nimmt man an, sonst können nämlich teilweise massenweise Ausgaben rauskommen und das ist ja auch nicht Sinn der Aufgabe :wink:


Ok hab mal die Schreibtischlaufaufgabe der 09 Klausur gemacht. Bitte um Korrektur, wenn was falsch is:

a) 4
b) 2,3,4
c) 1,2,3
d) 1
e) 1,2,3
f) 3
g)
z.b.
anna verschuettet 1
berta trinkt 1
berta vergisst 2
anna trinkt 3


die f) ist 6 , aber sonst ists richtig.

Man muss da einfach alle permutationen durchgehen, mit der einzigen Einschränkung, dass berta trinkt vor berta verschüttet kommt.

aabb, abab, baab, baba, bbaa, abba


Die Einschränkung muss sein, dass Berta trinkt, bevor sie vergisst.

Imho sind es nur die 3:

Berta trinkt Tasse 1
Berta vergisst Tasse 2
Anna verschüttet Tasse 3
Anna trinkt Tasse 4

Berta trinkt Tasse 1
Anna verschüttet Tasse 3
Berta vergisst Tasse 2
Anna trinkt Tasse 4

Berta trinkt Tasse 1
Anna verschüttet Tasse 3
Anna trinkt Tasse 4
Berta vergisst Tasse 2

Welche anderen Möglichkeiten soll es denn noch geben?

“Berta trinkt Tasse 1” muss immer am Anfang stehen, denn das gib() von “Berta vergisst” muss als zweites gib() kommen. Und dieses zweite gib() kann nur kommen, nachdem “Berta trinkt Tasse 1” bereits ausgegeben wurde.


hab ich doch grad schon geschrieben, berta1 muss nicht am anfang stehen, es muss nur vor berta2 kommen, anna kann sich trotzdem beliebig dazwischenschieben.

Anna verschüttet Tasse 3
Anna trinkt Tasse 4
Berta trinkt Tasse 1
Berta vergisst Tasse 2

Anna verschüttet Tasse 3
Berta trinkt Tasse 1
Berta vergisst Tasse 2
Anna trinkt Tasse 4

Anna verschüttet Tasse 3
Berta trinkt Tasse 1
Anna trinkt Tasse 4
Berta vergisst Tasse 2


Ich hätte zu der Aufgabe auch mal eine Frage. Zu Teil e):
Warum gibt es da mehrere Möglichkeiten von Zeilen, in der Tasse 1 auftreten kann? Ich hatte die vermutung, dass die Reihenfolge immer 1,2,3,4. Tasse sein müsste, weil ja immer nur ein Thread hochzählen kann und das ja in der Ausgabefunktion geschieht.
Das es nicht so ist, hab ich gemerkt, als ich den code mal ausgeführt hab.

Kann mir einer erklären was da der Hintergrund dazu ist? Warum werden die System.out.printlns nicht in Reihenfolge ausgegeben?

Danke!


Ok erklär mir mal wie:

Anna verschüttet Tasse 3
Anna trinkt Tasse 4
Berta trinkt Tasse 1
Berta vergisst Tasse 2

gehen soll?

So eine Ausgabe besteht ja aus 2 Schritten:

  1. gib() der Zeile auswerten
  2. Zeile ausgeben

Nach deiner Möglichkeit müsste diese Reihenfolge dann in etwas so aussehen:

  1. Werte gib() von “Berta trinkt” aus
  2. Werte gib() von “Berta vergisst” aus
  3. Werte gib() von “Anna verschüttet” aus
  4. Gib “Anna verschüttet Tasse 3” aus
  5. Werte gib() von “Anna trinkt aus”
    …gib die restlichen Sätze aus…

Dass dieser Schritt 1 und Schritt 2 aufeinander folgt ist aber NICHT möglich, denn vor Schritt 2 kommt definitiv die Ausgabe von “Berta trinkt”. Der Thread Berta kann die Ausgabe doch nicht einfach überspringen und erstmal das nächste gib() auswerten, wenn er den ersten Satz noch nicht ausgegeben hat.
In den beiden Threads ist die Reihenfolge jeweils fest (gib() → Ausgabe → gib() → Ausgabe). Die Threads können diese Schritte nur untereinander vermischen.


jedenfalls ist 6 richtig. Und soweit ich mich erinnern kann scheint es eben nicht notwendig zu sein, dass die zeile vorm zweiten gib() aufruf des selben threads ausgegeben werden muss.
gib1()
gib2()
ausgabe1
ausgabe2

hauptsache ausgabe1 kommt vor ausgabe2. Anders kann ichs mir jetzt auch nicht erklären, 6 stimmt jedenfalls und das ist die einzige möglichkeit so auf 6 zu kommen.

irgendwie werden doch die printlns von nem Scheduler noch verwaltet, nur so kann es doch überhaupt zu der ganzen falschen ausgabereihenfolge-Verwirrung in all den Aufgaben kommen.


Informell: Es kann passieren, dass die printlns von Berta aufgrund ungünstiger Prozessorzuteilungen länger auf dem “Weg bis zur Ausgabe” brauchen, als die von Anna, obwohl die von Berta früher losgeschickt wurden.