semaphore

Status
Nicht offen für weitere Antworten.

hellcoder

Mitglied
hallo,

veruche mich gerade an der semaphore implementierung eines federballspiel zwischen 4 personen...
1) person x schlägt den ball person x+1
2) ist der ball bei der letzten person angekommen, spielt diese den ball, über alle anderen personen zurück, zu person 1.

Code:
public class ball {
	int kann_schlagen = 1;
	int richtung = 1;
	semaphore sem = new semaphore(1);

	public void will_schlagen(int spieler) {
		while (kann_schlagen != spieler) {
			sem.p();
		}

		switch (richtung) {
		case 1:
			switch (kann_schlagen) {
			case 1:
				kann_schlagen = 2;
				System.out.println("1 -> 2");
				break;
			case 2:
				kann_schlagen = 3;
				System.out.println("2 -> 3");
				break;
			case 3:
				kann_schlagen = 4;
				System.out.println("3 -> 4");
				break;
			case 4:
				kann_schlagen = 3;
				System.out.println("4 -> 3");
				richtung = 2;
				break;
			}
			;
			break;

		case 2:
			switch (kann_schlagen) {
			case 2:
				kann_schlagen = 1;
				System.out.println("2 -> 1");
				richtung = 1;
				break;
			case 3:
				kann_schlagen = 2;
				System.out.println("3 -> 2");
				break;
			}
			;
			break;
		}

		sem.v();
	}
}

Code:
public class federballPraktikumSemaphorMain {
	public static void main(String[] args) {
		ball ball = new ball();
		spieler p1 = new spieler(ball, 1);
		spieler p2 = new spieler(ball, 2);
		spieler p3 = new spieler(ball, 3);
		spieler p4 = new spieler(ball, 4);

		p1.start();
		p2.start();
		p3.start();
		p4.start();
	}
}

Code:
public class spieler extends Thread {
	int nummer;
	ball ball;

	public spieler(ball ball, int nummer) {
		this.ball = ball;
		this.nummer = nummer;
	}

	public void run() {
		while (true) {
			ball.will_schlagen(nummer);
		}
	}
}

Code:
public class semaphore {
	
	  private int value;
		
	  public semaphore(int init) {
		  if (init < 0)
			  init =0;
		  value = init;
	}
	  public synchronized void p(){
		  while (value == 0){
			  try {
				  this.wait();
			  }
			  catch (InterruptedException e){
				  
			  }
		  }
		  value--;
	  }
	  
	  public synchronized void v(){
		  value++;
		  notify();
	  }
}

Ausgabe des Programm:
1 -> 2
2 -> 3
3 -> 4
4 -> 3

und danach hängt der thread....
vielleicht sieht jemand den fehler...

gruß,
marc
 
B

Beni

Gast
Nimm mal an, alle 4 Spieler warten in p, und das Semaphore ist in dem Status, dass es genau einen Spieler aufweckt.
Nun erwacht der falsche Spieler. Der falsche Spieler macht nichts, ausser dass er sofort wieder p aufruft -> und da er bereits im Semaphore war (er hat p hinter sich), kann er nicht erneut in den Semaphore eintreten -> deadlock.

Du musst entweder noch ein v in die Schleife nehmen, oder das p aus der Schleife bringen.
 
G

Guest

Gast
hallo beni,

genau daran lag's . danke für den hinweis....

gruß,
marc
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben