Peterson Algorithmus

U

UnWissender2012

Gast
Guten Tag,

ich summiere bei folgendem Code eine Variable hoch, dazu benutze ich zwei Threads.
Insgesamt müsste die Variable nach dem beide Threads fertig sind, auf 400000 stehen.
Das tut sie aber nicht.

Habe ich den Peterson Algorithmus nicht richtig angewendet?

Java:
public class Uebung_10_Peterson extends Thread
{
	public static int count = 0;
	
	public void run ()
	{
		sum_up ();
	}
	
	public static void increment ()
	{
		count ++;
	}
	
	public static void sum_up ()
	{
		for (int i = 0; i < 200000; i++)
		{
			increment ();
		}
	}
	
	public static void main (String[] args) throws InterruptedException
	{
		boolean flag0 = false, flag1 = false;
		int turn;
		Thread t1 = new Uebung_10_Peterson ();
		Thread t2 = new Uebung_10_Peterson ();
		
		// Prozess 1
		flag0 = true;
		turn = 1;
		while (flag1 && (turn == 1)) {}	// Busy-waiting
		t1.start ();
		flag0 = false;
		
		// Prozess 2
		flag1 = true;
		turn = 0;
		while (flag0 && (turn == 0)) {}	// Busy-waiting
		t2.start();
		flag1 = false;
		
		t1.join();
		t2.join();
		
		System.out.println("Summe: " + count);
	}
}
 
U

UnWissender2012

Gast
Java:
Summe: 223212

Java:
Summe: 214866

Java:
Summe: 209982

Drei durchläufe, immer überschreiben sich viele viele Variable^^
 

diggaa1984

Top Contributor
Vielleicht kann mir aber einer von den Wissenden, mal erklären, warum ein volatile in dem Fall nicht funktioniert/ausreicht?! Hatte es damit auch getestet und es hat nich geklappt.
 

Lybrial

Bekanntes Mitglied
Aber der Peterson-Algorithmus ist doch ein fester Algorithmus der ohne zusätzliche Locks, Semaphore oder Mutexe funktionieren sollte oder nicht? Hab mir grad mal in Wikipedia den Algo angeguckt der stimmt mit dem von Unwissender2012 überein (und zwar 1 zu 1, ob das ein Zufall ist ;))
 

diggaa1984

Top Contributor
hm hab ihn mir nich angeschaut aber ich bekomme ebenfalls nicht erwünschte aufgabe ohne veränderungen :) .. meine frage bleibt aber in dem fall dennoch, warum ein volatile das problem nicht löst und ich erst mit nem lock das ziel erreiche ???:L

Zusätzlich natürlich die verwunderung, dass es bei Final_Striker klappt :)
 
F

Firephoenix

Gast
Böse gesagt:
Kommt davon wenn man ohne nachzudenken abkopiert, vor allen Dingen wenn man aus einer anderen Sprache kopiert...
// Prozess #0
// ...
flag0 = true;
turn = 1;
while (flag1 && (turn == 1)) {} // busy waiting
// <kritischer Abschnitt>
flag0 = false;
// ...

Das hier ist Code der in Prozess 0 ausgeführt wird, kritischer abschnitt ist durch die Kritische Methode zu ersetzen, gleiches gilt hierfür:

// Prozess #1
// ...
flag1 = true;
turn = 0;
while (flag0 && (turn == 0)) {} // busy waiting
// <kritischer Abschnitt>
flag1 = false;
// ...

Der Code der im Thread ausgeführt wird ist die run-Methode, folglich benötigt man 2 verschiedene Threads, folgendes Beispiel läuft bei mir durch:
Java:
public class Uebung_10_Peterson
{
    // globale Variablendeklaration
    private boolean flag0 = false, flag1 = false;

    private int turn;

    public int count = 0;

    public void increment()
    {
        count++;
    }

    public void sum_up()
    {
        for ( int i = 0; i < 200000; i++ )
        {
            increment();
        }
    }

    public Uebung_10_Peterson()
        throws InterruptedException
    {
        Thread t1 = new Prozess1();
        Thread t2 = new Prozess2();
        t1.start();
        t2.start();

        t1.join();
        t2.join();

        System.out.println( "Summe: " + count );
    }

    public static void main( String[] args )
        throws InterruptedException
    {

        new Uebung_10_Peterson();

    }

    public class Prozess1
        extends Thread
    {
        @Override
        public void run()
        {
            // Prozess #0
            // ...
            flag0 = true;
            turn = 1;
            while ( flag1 && ( turn == 1 ) )
            {
            } // busy waiting
              // <kritischer Abschnitt>
            sum_up();
            flag0 = false;
        }
    }

    public class Prozess2
        extends Thread
    {
        @Override
        public void run()
        {
            // Prozess #1
            // ...
            flag1 = true;
            turn = 0;
            while ( flag0 && ( turn == 0 ) )
            {
            } // busy waiting
              // <kritischer Abschnitt>
            sum_up();
            flag1 = false;
        }
    }
}

Gruß
 
U

UnWissender2012

Gast
Hallo,

danke erstmal für die zahlreichen Antworten. Ich habe das nun versucht umzusetzen,
allerdings macht folgender Code überhaupt nichts, außer viel Rechenleistung zu schlucken....

Wenn ich jedoch aus der main z.B. das t2.join() auskommentiere, dann arbeitet ein Thread
zu ende und gibt 200000 aus. Der zweite Thread macht garnichts....
Wenn ich beide joins() rausmache, kommt ein komplett falsches Ergebnis (Z. B. 3028).

Beide Joins drinen scheinen sich irgendwie zu behindern...

Java:
public class Übung_10_Peterson
{
	public static void main (String[] args) throws InterruptedException
	{
		CountUp countUp = new CountUp ();
		
		Thread t1 = new ProcessOne (countUp);
		Thread t2 = new ProcessTwo (countUp);
		
		t1.start();
		t2.start();
		
		t1.join();
		t2.join();
	 
	    System.out.println( "Summe: " + countUp.count );
	}
}

Java:
public class CountUp
{
	public boolean flag0 = false, flag1 = false;
	public int turn;
    public int count = 0;
    
    public void increment ()
    {
        count ++;
    }
    
    public void sumUp ()
    {
        for (int i = 0; i < 200000; i++)
        {
            increment ();
        }
    }
}

Java:
public class ProcessOne extends Thread
{
	private CountUp countUp;
	
	public ProcessOne (CountUp countUp)
	{
		this.countUp = countUp;
	}
	
	public void run ()
	{
		countUp.flag0 = true;
	    countUp.turn = 1;
	    
	    while (countUp.flag1 && (countUp.turn == 1)) {}
	    
	    countUp.sumUp ();
	    countUp.flag0 = false;    
	}
}

Java:
public class ProcessTwo extends Thread
{
	private CountUp countUp;
	
	public ProcessTwo (CountUp countUp)
	{
		this.countUp = countUp;
	}
	
	public void run ()
	{
		countUp.flag1 = true;
		countUp.turn = 0;
	    
	    while (countUp.flag0 && (countUp.turn == 0)) {}
	    
	    countUp.sumUp ();
	    countUp.flag1 = false;    
	}
}
 
U

UnWissender2012

Gast
Hallo,

ja wenn ich mit den System.outs arbeite, stelle ich fest das er manchmal
ewig darauf wartet das Thread 1 sich beendet...
Ganz selten kommt es vor, das beid Threads zum Ende kommen.

Was ist denn das für ein seltsamer Fehler? ^^
 
U

UnWissender2012

Gast
Ahhhh....
ich hab gerade festgestellt, wenn ich nach t1.start() nen Thread.sleep() einbaue
funktioniert es. Das heißt wohl das sich die Threads durch Optimierungen (compiler)
in die quere kommen, ist das richtig?
Muss ich volatile verwenden?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Threads, Peterson Algo. Java Basics - Anfänger-Themen 4
K Algorithmus entwickeln Java Basics - Anfänger-Themen 1
laxla123 Eigenschaften eines Algorithmus (determiniert vs.. deterministisch) Java Basics - Anfänger-Themen 2
C Gewinnspiel erstellen mit Algorithmus Java Basics - Anfänger-Themen 3
C negamax-Algorithmus für Tic-Tac-Toe spielt manchmal falsch Java Basics - Anfänger-Themen 10
H Minimax Algorithmus in Tic Tac Toe Java Basics - Anfänger-Themen 3
M Minimax-Algorithmus für Vier gewinnt Java Basics - Anfänger-Themen 11
ohneInformatik; Trockentest Algorithmus, mathematischen Zusammenhang angeben Java Basics - Anfänger-Themen 3
M Minimax-Algorithmus Java Basics - Anfänger-Themen 17
mervanpolat Binary Search Algorithmus ausführen Java Basics - Anfänger-Themen 1
J Rekursiver Algorithmus Java Basics - Anfänger-Themen 9
M monte carlo Algorithmus für 4 gewinnt Java Basics - Anfänger-Themen 12
izoards Sortier Algorithmus für Bounding Box Elememte Links nach Rechts und von Oben nach Unten Java Basics - Anfänger-Themen 33
S Algorithmus entwicklen, der zu einem gegebenen Datum die Jahreszeit ermittelt Java Basics - Anfänger-Themen 13
rosima26 Merge-Algorithmus Java Basics - Anfänger-Themen 53
C Ein Algorithmus soll schneller werden Java Basics - Anfänger-Themen 24
D Dijkstra Algorithmus Hilfe!! Java Basics - Anfänger-Themen 9
U Den Kuchen aufteilen - aber wie? (Rebalancing-Algorithmus) Java Basics - Anfänger-Themen 14
s_1895 Pseudocode Naiver Algorithmus Java Basics - Anfänger-Themen 17
H String verschlüsseln - eigener Algorithmus Java Basics - Anfänger-Themen 104
T Algorithmus für Index mit min-Wert Java Basics - Anfänger-Themen 2
Düsseldorf2002 Testen meines Algorithmus Java Basics - Anfänger-Themen 1
D Primzahlen Rechner nach Eratostenes von Kyrene Algorithmus Java Basics - Anfänger-Themen 2
KogoroMori21 Frage zum Euklidischen Algorithmus Java Basics - Anfänger-Themen 11
S Algorithmus java searchAll IKey Java Basics - Anfänger-Themen 4
S Algorithmus Datensätze einfügen wenn... Java Basics - Anfänger-Themen 26
KogoroMori21 MergeSort Algorithmus Java Basics - Anfänger-Themen 2
KogoroMori21 Textdatei einlesen im Array (Selection Sort Algorithmus) Java Basics - Anfänger-Themen 3
fendix Compiler-Fehler Algorithmus zur Bestimmung von Primzahlen Java Basics - Anfänger-Themen 7
S Algorithmus (reelle Zahl <65536 von dezimal zu dual) max. 10 Nachkommastellen Java Basics - Anfänger-Themen 4
G Algorithmus Graphen Java Basics - Anfänger-Themen 10
D Input/Output fehlerhafter Algorithmus zum Ersetzen von Array-Werten nach logischem Schema Java Basics - Anfänger-Themen 1
N Selection Algorithmus: Methode wird nicht erkannt (BlueJ) Java Basics - Anfänger-Themen 3
U Meinung zum Dijkstra Algorithmus Java Basics - Anfänger-Themen 6
U Dijkstra Algorithmus Laufzeit Java Basics - Anfänger-Themen 3
L Math.exp also eigenen Algorithmus Java Basics - Anfänger-Themen 2
Kirby.exe Algorithmus entwickeln Java Basics - Anfänger-Themen 37
M Algorithmus Max-Heap? Java Basics - Anfänger-Themen 3
I Labyrinth auf der Basis eines rekursiven Algorithmus Java Basics - Anfänger-Themen 27
CptK Best Practice Algorithmus nach jedem Schritt zum Visualisieren pausieren Java Basics - Anfänger-Themen 3
A Algorithmus effizienter machen Java Basics - Anfänger-Themen 1
V Algorithmus zur fortlaufenden Berechnung des duechscjnt Java Basics - Anfänger-Themen 1
M Dijkstra Algorithmus in Graphen auf mehrere verschiedene Knoten anwenden lassen Java Basics - Anfänger-Themen 11
O Labyrinth Algorithmus Java Basics - Anfänger-Themen 3
G Quicksort Algorithmus Java Basics - Anfänger-Themen 12
S Binäre-Suche Algorithmus Java Basics - Anfänger-Themen 1
D Algorithmus in Pseudocode mit log2(n) Operationen erstellen Java Basics - Anfänger-Themen 3
C Laufzeit eines Sortier-Algorithmus ermitteln Java Basics - Anfänger-Themen 4
H aufgabe java luhn algorithmus Java Basics - Anfänger-Themen 10
A Datenstruktur für Savings Algorithmus und Planung von kleinen Programmierprojekten Java Basics - Anfänger-Themen 1
J Algorithmus für eine Reihe implementieren Java Basics - Anfänger-Themen 2
S Dijkstra Algorithmus funktioniert nicht Java Basics - Anfänger-Themen 4
N Denksportaufgabe durch Algorithmus lösen Java Basics - Anfänger-Themen 2
S Problem mit einem rekursivem FloodFill Algorithmus Java Basics - Anfänger-Themen 62
B Algorithmus Square und Multiply Java Basics - Anfänger-Themen 3
J Algorithmus - Strings auf eigene Reihenfolge miteinander vergleichen Java Basics - Anfänger-Themen 4
D Frage Boyer-Moore Algorithmus Java Basics - Anfänger-Themen 7
M Komplexität Algorithmus Java Basics - Anfänger-Themen 8
H Zeichen im algorithmus Java Basics - Anfänger-Themen 4
B Code Verständnisfragen - FLoyd Warshall Algorithmus Java Basics - Anfänger-Themen 1
B Algorithmus zum entmischen einer Zahlenfolge Java Basics - Anfänger-Themen 15
X Minimax-Algorithmus über alle Kanten möglich? - Kanten darstellen Java Basics - Anfänger-Themen 1
T Algorithmus zur Überprüfung eines binären Suchbaums Java Basics - Anfänger-Themen 2
K Best Practice Algorithmus für Berechnung von Zahlenreihenfolge Java Basics - Anfänger-Themen 12
M Simpler Algorithmus läuft extrem langsam. Java Basics - Anfänger-Themen 3
K Erste Schritte Brute Force Algorithmus Java Basics - Anfänger-Themen 2
L Frage zu BubbleSort Algorithmus Java Basics - Anfänger-Themen 2
B gibt es ein Stundenplan-Algorithmus? Java Basics - Anfänger-Themen 11
O Algorithmus-Problem Java Basics - Anfänger-Themen 5
P Euklidischer Algorithmus Java Basics - Anfänger-Themen 9
L Greates Commong Dividend - euklidischer Algorithmus, modulos not positive Java Basics - Anfänger-Themen 5
J Euklidischer Algorithmus Java Basics - Anfänger-Themen 1
S Quicksort Algorithmus Java Basics - Anfänger-Themen 2
S GraphNode --- Dijkstra Algorithmus : NullPointerException Java Basics - Anfänger-Themen 1
B Rekursive Algorithmus schreiben Java Basics - Anfänger-Themen 8
V Algorithmus in einer Methode ausführen Java Basics - Anfänger-Themen 3
M Implementierung des Knuth-Morris-Pratt-Algorithmus Java Basics - Anfänger-Themen 0
M Dijkstras Algorithmus Java Basics - Anfänger-Themen 5
S Zusammenhang Datenstruktur/Algorithmus Java Basics - Anfänger-Themen 1
M Simulation - Algorithmus Java Basics - Anfänger-Themen 3
F Erste Schritte Hilfe beim Algorithmus finden Java Basics - Anfänger-Themen 8
D Algorithmus für Punkte auf einem Kreis Java Basics - Anfänger-Themen 0
D Algorithmus zu gegebener Laufzeit implementieren Java Basics - Anfänger-Themen 1
B Doppelte Werte aus Array entfernen ohne Import - Algorithmus Java Basics - Anfänger-Themen 5
C Ideen für einen Algorithmus Java Basics - Anfänger-Themen 1
F Best Practice Algorithmus optimieren - Binaeruhr Java Basics - Anfänger-Themen 2
S Euklid Algorithmus zur Berechnung des GGTs Java Basics - Anfänger-Themen 2
L Welcher Algorithmus ist das ? Java Basics - Anfänger-Themen 9
J Rekursiver Horner-Schema-Algorithmus - Verstehe ich ihn richtig? Java Basics - Anfänger-Themen 2
O Java Zufalls-Verteil-Algorithmus Java Basics - Anfänger-Themen 3
P ganz simpler algorithmus Java Basics - Anfänger-Themen 3
C Sortieren ohne Algorithmus Java Basics - Anfänger-Themen 8
J Algorithmus: Grad von floating zu Grad/Minute/Sekunde Java Basics - Anfänger-Themen 3
A Text Verschriebung/Algorithmus(?) Java Basics - Anfänger-Themen 8
R Rekursionsformel für Laufzeit von Algorithmus Java Basics - Anfänger-Themen 3
E Algorithmus für kart. Produkt: als int [] Feld repräsentiert Java Basics - Anfänger-Themen 10
algebraiker Collections Bräuchte Hilfe bei dem Algorithmus - LinkedHashMap Java Basics - Anfänger-Themen 2
S A* Path Algorithmus in Java schon vorhanden Java Basics - Anfänger-Themen 3
S Bubble Sort Algorithmus Java Basics - Anfänger-Themen 3
N Unerklärlich: Rekursiver Algorithmus gibt falschen Datentyp zurück... Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben