- primeira solução:
#define FALSE 0
#define TRUE 1
sem mutex = 1;
int cruzandoOeste = FALSE; int cruzandoLeste = FALSE;
CruzaOeste() CruzaLeste()
{ /* simetrico a CruzaOeste() */
int consegui = FALSE;
repeat
P(mutex)
if (!cruzandoLeste){
cruzandoOeste = TRUE;
consegui = TRUE;
}
V(mutex);
until (consegui);
Cruza();
P(mutex);
cruzandoOeste = FALSE;
V(mutex);
}
- segunda solução:
sem oeste = 0; sem leste = 1;
CruzaOeste() CruzaLeste()
{ {
P(oeste); P(leste)
Cruza(); Cruza();
V(leste); V(oeste);
} }
- terceira solução:
int cruzandoLeste = 0; int queremLeste = 0;
int cruzandoOeste = 0; int queremOeste = 0;
sem oeste = 0; sem leste = 0; sem mutex = 1;
CruzaOeste() { CruzaLeste() {
P(mutex); /* simétrico a CruzaOeste() */
cruzandoOeste++;
if (!cruzandoLeste)
V(oeste);
else
queremOeste++;
V(mutex);
P(oeste);
Cruza();
P(mutex);
cruzandoOeste--;
if (!cruzandoOeste && queremLeste) {
queremLeste--;
V(leste);
}
V(mutex);
}