Monitor < Softwaretechnik+Pro < Praktische Inform. < Hochschule < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 15:26 Mo 30.11.2009 | Autor: | Killver |
Aufgabe | Threads A, B und C kooperieren bei der Aufgabe, 50 Werte zweier Arrays F und G zusammenzuzählen. Dabei A addiert die Werte der Arrays F und G mit geradem Index und legt Sie im Array H ab (H[0] = F[0]+G[0]). B tut genau dasselbe, aber nimmt nur Werte mit ungeradem Index. C berechnet danach die
Summe aller Werte des Arrays H. Schreiben Sie Code für diese drei Threads. Dabei müssen Sie einen Monitor verwenden (und es darf kein anderes Synchronisationshilfsmittel verwendet werden), und der Thread C muss die von A bzw. B berechneten Teilergebnisse ohne unnötige Verzögerung verarbeiten (dh. Wenn A gerade nicht dran war und B vier Zwischenergebnisse berechnet hat, muss C diese verarbeiten und darf nicht auf ein Ergebnis von A warten). |
Wie würde hier eurer Meinung nach eine saubere Lösung aussehen?
Es geht hier im Endeffekt nur um die Adaption, dass es keine Verzögerung gibt. Folgende Lösung ohne Verzögerung ist vorhanden:
monitor Sum
condition a, b;
integer maxA, maxB;
procedure waitForElement(i: integer);
begin
if (i % 2 == 0) then
begin
if (i > maxA) then wait(a);
end
else
begin
if (i > maxB) then wait(b);
end
end
procedure elementReady(i: integer);
begin
if (i % 2 == 0) then
begin
maxA := i;
signal(a)
end
else
begin
maxB := i;
signal(b)
end
end
end monitor;
procedure A;
begin
for i := 0 to 48 step 2 do
begin
H[i] := F[i] + G[i];
elementReady(i)
end
end
procedure B;
begin
for i := 1 to 49 step 2 do
begin
H[i] := F[i] + G[i];
elementReady(i)
end
end
procedure C;
integer i;
begin
i := 0;
while (i < 50) do
begin
waitForElement(i);
sum := sum + H[i];
i := i + 1
end
end
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 01:29 Di 01.12.2009 | Autor: | felixf |
Hallo!
Ein kurzer Kommentar:
> [...]
> Thread C muss die von A bzw. B berechneten Teilergebnisse
> ohne unnötige Verzögerung verarbeiten (dh. Wenn A gerade
> nicht dran war und B vier Zwischenergebnisse berechnet hat,
> muss C diese verarbeiten und darf nicht auf ein Ergebnis
> von A warten).
>
> Wie würde hier eurer Meinung nach eine saubere Lösung
> aussehen?
>
> Es geht hier im Endeffekt nur um die Adaption, dass es
> keine Verzögerung gibt. Folgende Lösung ohne Verzögerung
> ist vorhanden:
> [...]
Die Loesung ist leider nicht korrekt. In der Implementation von C wird, wenn etwa B die Werte 1, 3, 5 berechnet und A gerade mal 0 berechnet hat, nur die Werte fuer 0 und 1 summiert, aber nicht die fuer 3 und 5, obwohl die bereits vorliegen. Das widerspricht dem obigen Ausschnitt der Aufgabenstellung.
LG Felix
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 09:55 Di 01.12.2009 | Autor: | Killver |
Um das geht es ja :) Hab mich nur schlecht ausgedrückt. Diese Lösung is mit Verzögerung, und ich möchte sie ohne Verzögerung. Also genau das lösen, was du angemerkt hast.
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 10:24 Di 01.12.2009 | Autor: | felixf |
Hallo!
> Threads A, B und C kooperieren bei der Aufgabe, 50 Werte
> zweier Arrays F und G zusammenzuzählen. Dabei A addiert
> die Werte der Arrays F und G mit geradem Index und legt Sie
> im Array H ab (H[0] = F[0]+G[0]). B tut genau dasselbe,
> aber nimmt nur Werte mit ungeradem Index. C berechnet
> danach die
> Summe aller Werte des Arrays H. Schreiben Sie Code für
> diese drei Threads. Dabei müssen Sie einen Monitor
> verwenden (und es darf kein anderes
> Synchronisationshilfsmittel verwendet werden), und der
> Thread C muss die von A bzw. B berechneten Teilergebnisse
> ohne unnötige Verzögerung verarbeiten (dh. Wenn A gerade
> nicht dran war und B vier Zwischenergebnisse berechnet hat,
> muss C diese verarbeiten und darf nicht auf ein Ergebnis
> von A warten).
> Wie würde hier eurer Meinung nach eine saubere Lösung
> aussehen?
>
> Es geht hier im Endeffekt nur um die Adaption, dass es
> keine Verzögerung gibt. Folgende Lösung ohne Verzögerung
> ist vorhanden:
>
> monitor Sum
> condition a, b;
> integer maxA, maxB;
Die Idee, jeweils fuer A und B zu speichern wie weit sie sind ist gut.
> procedure waitForElement(i: integer);
> begin
> if (i % 2 == 0) then
> begin
> if (i > maxA) then wait(a);
> end
> else
> begin
> if (i > maxB) then wait(b);
> end
> end
Ich wuerde hieraus eine Funktion waitForNewElement machen, die zurueckliefert welcher Index als neustes dazu gekommen ist, die aber nicht auf einen spezifischen Index wartet.
(Dazu brauchst du auch nur noch eine condition.)
> procedure C;
> integer i;
> begin
> i := 0;
> while (i < 50) do
> begin
> waitForElement(i);
> sum := sum + H[i];
> i := i + 1
> end
> end
Hier solltest du auch einen bisher maximal verarbeiteten Index fuer A und B speichern. Sobald waitForElement einen neuen Index liefert, guckst du ob er zu A oder B gehoert, und wieviele neue es bei A bzw. B gegeben hat, und fuegst die jeweils neuen hinzu.
LG Felix
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 18:23 Di 01.12.2009 | Autor: | Killver |
Könntest du dies vll. Codetechnisch asuführen? Danke im Voraus!
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:13 Mi 02.12.2009 | Autor: | felixf |
Hallo!
> Könntest du dies vll. Codetechnisch asuführen? Danke im
> Voraus!
Das kann ich schon tun, ich werde es aber nicht machen. Du bist schliesslich derjenige der es lernen soll :)
LG Felix
|
|
|
|