SWT[5]#3

Thomas
Administrator
Beiträge: 383
Registriert: Do 23. Okt 2008, 20:16
Wohnort: Karlsruhe
Kontaktdaten:

Re: SWT[5]#3

Beitrag von Thomas »

könnte es sein dass du die cyclic-barrier verwendest? wenn ja bei mir gings damit auch nicht erst als ich join verwendet habe hats geklappt
Chrisss
Beiträge: 63
Registriert: So 25. Jan 2009, 20:21

Re: SWT[5]#3

Beitrag von Chrisss »

ich habs mit der CyclicBarrier gelöst und hatte damit nicht das geringste problem hm
hab bei ner size von 2000 sequentiel ~7000ms und ab 8 threads liegt die dauer bei ~3500ms, somit also t(1)/t(p) = ~2
hab aber nur nen paar werte bisher ausprobiert bis jetzt^^
Thomas
Administrator
Beiträge: 383
Registriert: Do 23. Okt 2008, 20:16
Wohnort: Karlsruhe
Kontaktdaten:

Re: SWT[5]#3

Beitrag von Thomas »

hm berechnest du das ergebnis in der run-methode() der cyclicbarrier? ich wollte es so machen dass alle threads an der cyclicbarrier warten und hab danach mit return einfach das ergebnis ausgegeben da war das ergebnis immer noch nicht zu ende gerechnet warum auch immer. dein wert sieht aba mal richtig aus und so lang das bild dazu passt is ja alles gut^^ ich bin damit leider iwie nicht wirklich zurecht gekommen hätte die barrier auch gern verwendet um nicht mit jedem thread join() aufzurufen
SLS
Beiträge: 77
Registriert: So 26. Okt 2008, 20:11
Wohnort: Karlsruhe

Re: SWT[5]#3

Beitrag von SLS »

Thomas hat geschrieben:hm berechnest du das ergebnis in der run-methode() der cyclicbarrier? ich wollte es so machen dass alle threads an der cyclicbarrier warten und hab danach mit return einfach das ergebnis ausgegeben da war das ergebnis immer noch nicht zu ende gerechnet warum auch immer. ...
Dass dein Ergebnis nicht zu Ende berechnet wird, liegt daran, dass der Hauptfaden, der die Arbeiterfäden erstellt und startet, gleich nach dem Starten des letzten Arbeiterfadens fertig wird und dann das Ergebnis zurückgibt. Dabei sind möglicherweise ein paar Arbeiterthreads noch nicht fertig, und somit wird ein unvollständiges Bild gezeichnet. Die einfachste Lösung, die mir eingefallen ist, wenn man immer noch eine CyclicBarrier verwenden möchte, ist einfach für die Barriere anzahlThreads+1 einzustellen und auch den Hauptfaden bei der Barriere warten zu lassen vor der "return"-Anweisung. Dann gibt der Hauptfaden das Ergebnis erst dann zurück, wenn auch alle Arbeitfäden auf der Barriere warten, sprich - fertig sind.

Kurze Frage: Was ist denn bei euch bei 3a) die Kontext-Klasse aus dem Muster - Start !? Irgendwie überstimmt es nicht so genau mit den Beispielen aus der Vorlesung.

EDIT:
Wikipedia - Strategie (Entwurfsmuster) hat geschrieben:Der Kontext hält eine Member-Variable der Schnittstelle Strategie, wird aber mit einer Referenz auf das gewünschte konkrete Strategieobjekt belegt. Somit wird der Algorithmus über die Schnittstelle verwendet und dies ermöglicht auch ein Austauschen der Algorithmen zur Laufzeit.
Also sollte doch "Display" der Kontext sein.
When we say that two functions are almost always used together, we should remember that "almost" is a euphemism for "not."
-- David L. Parnas, "Designing Software for Ease of Extension and Contraction"
Thomas
Administrator
Beiträge: 383
Registriert: Do 23. Okt 2008, 20:16
Wohnort: Karlsruhe
Kontaktdaten:

Re: SWT[5]#3

Beitrag von Thomas »

hm aba bei start wird ja das objekt erzeugt mit createMandelbrot().
habs mal ausprobiert mit threadcount + 1 funktioniert bei mir aba trotzdem leider nicht

Code: Alles auswählen

public void run() {
			double cReal;
			double cImag;
			for(int x = start; x < end; x++) {
				for (int y = 0; y < sidelength; y++) {
					cReal = translateReal(x);
					cImag = translateImag(y);
					result[x][y] = computeMandelbrotPoint(cReal, cImag);
				}
		    }
			try {
				barrier.await();
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (BrokenBarrierException e) {
				e.printStackTrace();
			}
		}
so müsste die run methode doch aussehen oda?
naja vllt liegts wirklich daran dass ich ne innere klasse habe oder macht ihr das auch so?
Dre
Beiträge: 139
Registriert: Do 23. Okt 2008, 21:35
Wohnort: Karlsruhe
Kontaktdaten:

Re: SWT[5]#3

Beitrag von Dre »

Hatt ich genauso... MIr hat er aber unter Gebrauch der Barrier in

Code: Alles auswählen

barrier.await();
immer wieder Exceptions geworfen, bis ich dann auf ne andere Alternative umgestiegen bin.
Cheers André
Christian S.
Beiträge: 225
Registriert: Sa 25. Okt 2008, 12:48

Re: SWT[5]#3

Beitrag von Christian S. »

Habe als Kontext-Klasse Start, da da ja anhand von deinen Eingabeparametern der Algorithmus gewählt wird.
SLS
Beiträge: 77
Registriert: So 26. Okt 2008, 20:11
Wohnort: Karlsruhe

Re: SWT[5]#3

Beitrag von SLS »

Anfangs hatte ich auch Start als Kontext, aber trotzdem glaube ich inzwischen, dass das falsch ist.
Guckt euch die Folie "Strategie: Beispiel aus Java" an - da wird ein LayoutManager außerhalb des Kontexts (Container) erstellt. Es stimmt also nicht unbedingt, dass die Instanzierung einer konkreten Implementierung in dem Kontext geschieht. Es mag sein, dass die Außenwelt das macht und durch eine Methode (im Beispiel "setLayout()", in der Aufgabe - den Konstruktor von Display) die in Wikipedia genannte Member-Variable vom abstrakten Typ setzt. Start würde auch nichtmal (direkt) computeMandelbrot() aufrufen, wenn es nicht diese zusätzliche Möglichkeit gab, den Fenster nicht zu erstellen. Für mich ist also "Start" eher eine Klient-Klasse, also Anwender, als der im Entwursfmuster gennanten Kontext.
Christian S. hat geschrieben:Habe als Kontext-Klasse Start, da da ja anhand von deinen Eingabeparametern der Algorithmus gewählt wird.
Das gilt genauso gut für die Klassen MainFrame und Display - da wird der Algorithmus anhand von einem Konstruktorparameter gewählt.

@Thomas:
Bei mir ist die Arbeiterklasse auch eine innere Klasse. Deine run()-Methode sieht richtig aus bis auf die Indexgrenzen in den Schleifen. Was mich stört ist etwa dieses "sidelength" - das sollte doch "height" sein, oder? Deine Implementierung sollte ja auch mit widht!=height arbeiten können.
Ansonsten sollst du nicht nur einfach anzahlThreads+1 bei der Barriere einstellen, sondern auch barrier.await() auch vom Hauptfaden aufrufen vor "return result;"
Zuletzt geändert von SLS am Do 2. Jul 2009, 01:09, insgesamt 2-mal geändert.
When we say that two functions are almost always used together, we should remember that "almost" is a euphemism for "not."
-- David L. Parnas, "Designing Software for Ease of Extension and Contraction"
Thomas
Administrator
Beiträge: 383
Registriert: Do 23. Okt 2008, 20:16
Wohnort: Karlsruhe
Kontaktdaten:

Re: SWT[5]#3

Beitrag von Thomas »

ja sidelength hab ich height übergeben ich hab run ja in der inneren klasse und speichere in der variable sidelength die höhe das kann ich natürlich aba noch in höhe ändern. werds mal versuchen so wie du gesagt hast vllt klappts ja.
SLS
Beiträge: 77
Registriert: So 26. Okt 2008, 20:11
Wohnort: Karlsruhe

Re: SWT[5]#3

Beitrag von SLS »

Ich drücke dir die Daumen - bei mir hat es geklappt :)
When we say that two functions are almost always used together, we should remember that "almost" is a euphemism for "not."
-- David L. Parnas, "Designing Software for Ease of Extension and Contraction"
Antworten

Zurück zu „Übung“