# Monitore, Signal - and Wait



## bRainLaG (18. Jul 2011)

Hallo ich lerne grade Monitore (für Klausur) und bin nun auf das Problem gestoßen, dass ich Monitore mit Signal-and-Continue beschrieben habe, jedoch Signal and Wait noch nie.

Ein Beispiel (Pseudocode):


```
process Car {
	if (dir = north || south){
		bridge.enterFromNorth();
		bridge.leaveFromNorth();
	}
	else {
		bridge.enterFromSouth();
		bridge.leaveFromSourh():
	}
}

monitor Bridge {
	int north = 0, south = 0;
	Condition waitNorth, waitSouth;
	
	procedure enterFromNorth() {
		if (south > 0) waitNorth.wait();
		north++
	}
	
	procedure leaveFromNorth(){
		north--;
		if (north == 0){
			waitSouth.notifyAll();
		}
	}
	procedure enterFromSouth(){
		if (north > 0) waitSouth.wait();
		south++
	}
	procedure leaveFromSouth(){
		south--;
		if (south == 0){
			waitNorth.notifyAll();
		}
	}
```

Ich habe nun die Frage wie das genau bei Signal-and-Wait und Signal-and-urgentWait aussehen würde, da sich mir aus den formalen Aussagen über die beiden Prinzipien nicht wirklich klar wird wo genau der Unterschied liegt


----------



## bRainLaG (18. Jul 2011)

hat da keiner ne Ahnung?


----------



## Marco13 (19. Jul 2011)

Geduld, Geduld, da meldet sich vielleicht noch jemand 

Die Begriffe sind mir in dieser Form nicht so geläufig. Ich frage mich, ob sich das so direkt auf die Java-Sprachinternen Monitore und Locks übertragen läßt, oder ob man das nicht (wenn überhaupt) mit den java.util.concurrent Locks und Conditions bauen müßte? ???:L Aber selbst da würde mir (speziell um diese Uhrzeit) spontan kein plausibles Beispiel einfallen...


----------



## Andi_CH (19. Jul 2011)

Signal Wait ist eine Standardbezeichnung für einen bestimmten Synhronisationsmechanismus.
Die beiden anderen habe ich noch nie gehört, aber ich bin gespannt ob da noch was kommt.

Mehr als einen Link kann ich im Moment nicht beitragen


----------



## SlaterB (19. Jul 2011)

ich habs mir damals schon ein wenig angeschaut, kenne ich aber auch nicht genug um sinnvoll was zu sagen,
da steht doch ne Menge im Wiki bzw. wo immer man die Information herhat, mal mit priorisierten Thread (urgent), mal ohne,
scheint doch alles seinen Sinn zu haben wenn man das durchgehend verstanden hat

was kann da an der Umsetzung ein Problem sein? 
entweder man hat die Priorisierung usw. oder nicht, ist das nicht einfach zu verstehen (sofern man im Thema drin ist)?
die Beispiele sind ja umständlich mit Warteschlangen usw. gebaut, da kann man nicht erwarten dass es per Fingerschnippen auch ohne geht

der Code des ersten Postings ist übrigens kein Java, da habe ich extra hier in allgemeinen Softwareentwicklung-Bereich verschoben


allgemeiner Tipp:
'ich habe eine Aufgabe, ich weiß schon manches, ich habe noch Schwierigkeiten, ich sage/ mach gar nix, ihr bitte komplett lösen'
klingt übrigens generell schlechter als
'ich habe eine Aufgabe, ich weiß schon manches, und zwar .., ich habe noch Schwierigkeiten, und zwar wie konkret Punkt ... an Stelle .. passt, außerdem .. und .. und dann habe ich ja noch .. zu sagen, kann mir jemand bei diesem eingegrenzten konkreten Detail weiterhelfen?'


----------



## Marco13 (19. Jul 2011)

Nochmal kurz die Wiki-Seite überflogen: Soweit ich das sehe, kann man mit den Java-_Sprach_internen Mitteln wirklich nur Signal And Continue abbilden: Genau das wird ja mit wait/notify/notifyAll gemacht, und diese verschiedenen queueing-Strategien kann man nicht direkt beeinflussen. Ich vermute wirklich, dass man das bestenfalls mit java.util.concurrent Ansatzweise nachbauen kann.


----------



## alexander.s (19. Jul 2011)

Hi

Schreibst nicht zufällig bald eine Klausur in Nichtsequentielle Programmierung? Wie auch immer... 
Überlege dir eine Lösung die fair ist. Wie sie jetzt abgebildet ist, ist sie nämlich noch unfair. Es können hintereinander nur Autos kommen von dem Süden oder Norden, aber würden sich nicht abwechseln. Um daraus signal and wait zu machen, könntest du bei der fairen Lösung eine covering Condition verwenden. Sofern kein Wagen vom Süden wartet, signalisierst du die vom Norden. Ansonsten müssen die im Süden warten.
Siehe die Duschkabine Aufgabe, sehr ähnlich zur Brückenaufgabe. Bei signal and urgent wait hätte ich selbst Probleme. Hoffe du verstehst was ich meine ohne dir die exakte Lösung zu verraten. Hoffe, ich konnte irgendwo ein wenig helfen.


Hier die Duschkabine-Aufgabe in Java (faire Lösung), wäre noch signal-and-continue:



```
public synchronized void enterMan(int id) throws InterruptedException{
		man++;
		while((nf>0||nm>=n)||(man>0) && woman==0){
				out(Thread.currentThread().getName()+" Man "+id+" waits...");
				this.wait();
				man--;
		}
		nm++;
		out(Thread.currentThread().getName()+" Man "+id+" is trying to clean his body");
	}
	
	public synchronized void leaveMan(int id){
		nm--;
		out(Thread.currentThread().getName()+" Man "+id+" is leaving");
		if(nm==0){
			this.notifyAll();
		}
	}
	
	public synchronized void enterWoman(int id) throws InterruptedException{
		woman++;
		while((nm>0||nf>=n)||((woman>0 && man==0))){
				out(Thread.currentThread().getName()+" Woman "+id+" waits...");
				this.wait();
				woman--;
		}
		nf++;
		out(Thread.currentThread().getName()+" Woman "+id+" is trying to clean her body");
	}
		
	
	public synchronized void leaveWoman(int id){
		nf--;
		out(Thread.currentThread().getName()+" Woman "+id+" is leaving");
		if(nf==0){
			this.notifyAll();
		}
	}
	
	private synchronized void out(String string) {
		System.out.println(string);
	}
```


----------

