Threads und Monitore < Technische Inform. < Praktische Inform. < Hochschule < Informatik < Vorhilfe
|
Status: |
(Frage) überfällig | Datum: | 11:18 Do 14.01.2010 | Autor: | userzwo |
Aufgabe | Wir habe hier einen kleinen Flughafen mit zwei Start und Landebahnen.
Um die Sicherheit zu gewährleisten, muß sichergestellt sein,
dass wen ein Flugzeug starten oder alnden möchte die jeweilige startbahn auch frei ist. |
hallo leute,
ich hab hier etwas pseudocode zur aufgabe verfasst.
allerdings sperre ich hier immer beide bahnen obwohl es nur für eine notwendig ist.
und ich weiß auch nicht auf welcher gelandet oder gestartet wird.
ich bedanke mich schon mal für eure hilfe
monitor Airport {
typedef struct airport{
mutex_object queue1;
mutex_object queue2;
mutex_object lane1;
mutex_object lane2;
cond_object lanefree;
boolean lane1free;
boolean lane2free;
queue * landingPlanes;
queue * startingPlanes;
} airport;
// Wird aufgerufen, wenn ein Flugzeug starten möchte
void onPlaneStart( airport* a ) {
lock(a->queue1);
a->startingPlanes.add(this);
unlock(a->queue1);
lock(a->lane1);
lock(a->lane2);
while (!a->lane1free && !a->lane2free)
{
cwait(a->lanefree);
if(lane1free)
{
lane1free = false;
break;
}
else if(lane2free)
{
lane2free = false
break;
}
}
onLanded(a);
}
// Wird aufgerufen, wenn ein Flugzeug landen möchte
void onPlaneLand( airport* a ) {
lock(a->queue2);
a->landingPlanes.add(this);
unlock(a->queue2);
lock(a->lane1);
lock(a->lane2);
while (!a->lane1free && !a->lane2free)
{
cwait(a->lanefree);
if(lane1free)
{
lane1free = false;
break;
}
else if(lane2free)
{
lane2free = false
break;
}
}
unlock(a -> lane1);
unlock(a -> lane2);
onStarted(a);
}
// Wird aufgerufen, wenn ein Flugzeug gerade gelandet ist
// und die Landebahn verlassen hat
void onLanded( airport* a ) {
lock(a->queue2);
a->landingPlanes.remove(this);
unlock(a->queue2);
lock(a -> lane1);
lock(a -> lane2);
csignal(a->lanefree);
unlock(a->lane2);
unlock(a->lane1);
}
// Wird aufgerufen, wenn ein Flugzeug gerade gestartet ist
// und die Startbahn verlassen hat
void onStarted( airport* a ) {
lock(a->queue1);
a->startingPlanes.remove(this);
unlock(a->queue1);
csignal(a->lanefree);
unlock(a->lane2);
unlock(a->lane1);
}
}
mfg
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:20 Sa 16.01.2010 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|