Cerco di descrivere al meglio il mio problema 
Nel commento iniziale c'è scritto cosa dovrebbe fare il programmino. Tutto sembra funzionare eccetto che.. Quando l'ultima auto in un senso termina l'attraversamento del ponte, e quindi dovrebbe liberare il passaggio per quelle in coda all'altro lato, questo non accade, causando uno stallo che non si sblocca più. FORSE , e dico forse, data la mia non eccelsa esperienza, potrebbe essere dovuto al fatto che quando l'ultima auto esce, non riesce a fare la "post" sul semaforo "ponte" per liberarlo, poichè le auto da sud sono in sezione critica sullo stesso semaforo!
Qualcuno saprebbe suggerirmi come posso risolvere questo problema? :s
Ringrazio anticipatamente chiunque mi aiutera 
codice:
//Strada a due corsie e doppio senso di marcia
//vi è un ponte ad UNA SOLA corsia percorribile a senso unico alternato
//Il ponte ha una capacità di N automobili
//Le automobili dirette verso Nord (o Sud) possono attraversare il ponte
//solo se non è attraversato da nessuna automobile diretta nel senso opposto
//Generare l'arrivo delle macchine da Nord e Sud in modo casuale
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define N 4
#define TOT 15
void *transito_da_sud(void*args);
void *transito_da_nord(void*args);
void auto_da_sud();
void auto_da_nord();
int passate = 0;
int capacita = N;
int autonord = 0;
int autosud = 0;
sem_t posti;
sem_t ponte;
pthread_mutex_t mutex;
int main() {
pthread_t da_nord;
pthread_t da_sud;
sem_init(&ponte, 0, 1);
sem_init(&posti, 0, N);
pthread_mutex_init(&mutex, NULL);
while(1) {
int delay = rand() % 14;
sleep(delay);
if(passate >= TOT) { //
printf("Il ponte è crollato. Non si passa più\n"); // Il blocco di controllo che fa terminare l'esecuzione
break; //
}
else { //
int NS = rand() % 2; //
if (!NS) { //
auto_da_nord(); //
pthread_create(&da_nord, NULL, transito_da_nord, NULL); //
//
} // BLOCCO per l'arrivo casuale delle auto
else { //
auto_da_sud(); //
pthread_create(&da_sud, NULL, transito_da_sud, NULL); //
//
} //
} //
}
return 0;
}
void *transito_da_nord(void*args) {
pthread_mutex_lock(&mutex);
autonord++;
if (autonord == 1) {
sem_wait(&ponte);
}
pthread_mutex_unlock(&mutex);
if(capacita == 0) printf("Non ci sono posti sul ponte.. L'auto proveniente da nord attende..");
sem_wait(&posti);
pthread_mutex_lock(&mutex);
capacita--;
pthread_mutex_unlock(&mutex);
printf("Un'auto proveniente da nord è entrata nel ponte \n");
sleep(5);
printf("Un'auto proveniente da nord è uscita dal ponte \n");
sem_post(&posti);
pthread_mutex_lock(&mutex);
capacita++;
passate++;
autonord--;
if(autonord == 0) {
sem_post(&ponte);
}
pthread_mutex_unlock(&mutex);
}
void *transito_da_sud(void*args) {
pthread_mutex_lock(&mutex);
autosud++;
if (autosud == 1) {
sem_wait(&ponte);
}
pthread_mutex_unlock(&mutex);
if(capacita == 0) printf("Non ci sono posti sul ponte.. L'auto proveniente da sud attende..");
sem_wait(&posti);
pthread_mutex_lock(&mutex);
capacita--;
pthread_mutex_unlock(&mutex);
printf("Un'auto proveniente da sud è entrata nel ponte \n");
sleep(5);
printf("Un'auto proveniente da sud è uscita dal ponte \n");
sem_post(&posti);
pthread_mutex_lock(&mutex);
capacita++;
passate++;
autosud--;
if(autosud == 0) {
sem_post(&ponte);
}
pthread_mutex_unlock(&mutex);
}
void auto_da_nord() {
printf("Arriva una macchina da Nord\n");
}
void auto_da_sud() {
printf("Arriva una macchina da Sud\n");
}