Un vecchio ponte consente di attraversare un fiume nelle direzioni nord→sud e sud→nord, con i seguenti vincoli:
Programmare il veicolo che viaggia in senso nord→sud (programma goingToSouth) ed il veicolo che viaggia in senso sud→nord (programma goingToNorth)
semaphore mutex=1, toNorth=0, toSouth=0;
boolean ponteLibero=true;
int bookToNork=0, bookToSouth=0;
enteringNorth(){
wait(mutex);
if(ponteLibero){
ponteLibero = false;
signal(mutex);
}else{
bookToSouth++;
signal(mutex);
wait(toSouth);
}
}
exitingSouth(){
wait(mutex);
if(bookToNorth > 0){
bookToNorth--;
signal(toNorth);
}else{
if(bookToSouth > 0){
bookToSouth--;
signal(toSouth);
}else{
ponteLibero = true;
}
}
signal(mutex);
}
goingToSouth(){
enteringNorth();
crossingToSouth();
exitingSouth();
}
goingToNorth(){
enteringSouth();
crossingToNorth();
exitingNorth();
}
Per smaltire il traffico con maggiore efficienza, supponiamo ora che quando un veicolo è in attesa ad un lato del ponte perchè altri veicoli stanno andando verso il lato in cui si trova, sia consentito ad ulteriori 10 veicoli di entrare dal lato opposto.
semaphore mutex = 1, toNorth = 0, toSouth = 0;
boolean ponteLibero = true;
int gointToSouth = 0, extraToNorth = 0, extraToSouth = 0;
void enteringNorth(){
wait(mutex);
if(goingToNorth = 0 && bookToNorth = 0){
goingToSouth++;
signal(mutex);
}else{
if(goingToSouth > 0 && extraToSouth < 10){
extraToSouth++;
goingToSouth++;
signal(mutex);
}else{
bookToSouth++;
signal(mutex);
wait(toSouth);
}
}
}
void exitingSouth(){
wait(mutex);
goingToSouth--;
if(goingToSouth = 0){
if(extraToSouth > 0){
extraToSouth = 0;
}
while(bookToNorth > 0){
goingToNorth++;
bookToNorth--;
signal(toNorth);
}
}
signal(mutex);
}
goingToSouth(){
enteringNorth();
crossingToSouth();
exitingSouth();
}
goingToNorth(){
enteringSouth();
crossingToNorth();
exitingNorth();
}