Un programma multi-thread simula il funzionamento di un ponte mobile
su un fiume navigabile. Un thread nave arriva periodicamente ed esegue
il seguente codice:

void *nave (void *)
{
  while (1) {
     richiedi_apertura_ponte();
     passaggio();
     rilascia_chiusura_ponte();
     ....
  }
}

Sul ponte, possono passare delle automobili, ma non piu' di 10 per
volta possono stare sul ponte contemporaneamente. Un'auto e' simulata
dal seguente thread:

void *auto(void *)
{
  ingresso();
  attraversa();
  uscita();
  ...
}

Quando la nave richiede l'apertura del ponte, prima bisogna aspettare
che tutte le auto attualmente in attraversamento escano dal ponte,
quindi si apre il ponte e si fa passare la nave. Le auto che
richiedono di passare dopo la richiesta della nave, vengono bloccate
in attesa del passaggio della nave e della richiusura del ponte.

Scrivere la struttura dati ponte, e le funzioni richiedi_apertura_ponte(),
rilascia_chiusura_ponte(), ingresso(), uscita().


