INFOPedia : LSOPonteTibetano

HomePage :: Categorie :: Indice :: Ultime modifiche :: Ultimi commenti :: Login/Registrazione
La versione più recente è stata modificata il 2006-06-08 15:38:58 da DenteDiLupo [aggiunti link alle singole implementazioni]

Aggiunzioni:
Possibile implementazione 1
Possibile implementazione 2
Torna a Lab Sistemi Operativi


Omissioni:
// L'algoritmo dovrebbe esser corretto, sono tuttavia convinto che ci sia un'anomalia nel controllo del peso.
// A mio parere sorge dall'utilizzo di un HANDLE temporaneo che ad ogni ciclo viene sovrascritto!
// Tento di risolvere...inserendo il controllo Peso dopo la creazione di ogni singolo Thread.
// A volte il programma sembra vada in deadlock...penso sia legato ai timeout...cmq...il 90% delle volte funziona.
#include <conio.h>
#include <ctype.h>
#include <time.h>
#include <windows.h>
#include <stdio.h>
#include <process.h>
#define MAXPESO 1000 // Peso massimo sostenibile dal ponte
#define PESOP 150    // Peso di una persona Standard
#define PESOC 300    // Peso di un carro Standard
#define ANDATA 0     // ANDATA
#define RITORNO 1    // RITORNO
#define GetRandom(min, max) ((rand() % (int)(((max) +1) - (min))) + (min)) // Funzione di Generazione interi casuali
// Le seguenti variabili globali saranno protette da Mutex!
int PesoAttuale = 0;    // Var. Glob. per il Peso Attuale sul ponte
int Persone[2] = {0,0}; // Var. Glob. per il Conteggio Persone sul ponte
// Funzioni Thread.
void Pedone(LPDWORD lpdwParam); // Un Pedone.
void Carro(LPDWORD lpdwParam); // Un Carro.
// Handle globali dei semafori e dei mutex: Semafori Corsie, Mutex Var. Glob., Mutex Stream di Output
HANDLE hCorsiaA[2], hCorsiaR[2], hPeso, hPersone, hPrint;
// Inizia il programmino...=)
void main() {
    // Conteggio Thread e cicli di wait per il peso.
    int c,count = 0;
    c= count;
    // Var. Flag per la destinazione
    int A = ANDATA;
    int R = RITORNO;
    srand((unsigned)time(NULL)); // Generazione del seed per il rand
    // Creo i Mutex e i Semafori
    hPeso = CreateMutex(NULL,false,NULL);
    hPersone = CreateMutex(NULL,false,NULL);
    hPrint = CreateMutex(NULL,false,NULL);
    for( int i = 0; i<2; i++ ) {
        // NB: Ho utilizzato i semafori per essere sicuro di ottenere il numero di corsia giusto all'interno dei thread.
        hCorsiaA[i] = CreateSemaphore(NULL,1,1,NULL);
        hCorsiaR[i] = CreateSemaphore(NULL,1,1,NULL);
    }
   
    HANDLE hNow; // Handle temporaneo per il resume dei thread.
   
    printf("Pressa un tasto per generare un carro o un pitone. q per uscire.\n");
    // Comincia il ciclo di creazione dei Thread :|
    do{
        if(GetRandom(0,1)) {  // Creo un Carro se GetRandom ritorna 1
            if(GetRandom(0,1)){ // La destinazione è ANDATA se il GetRandom ritorna 1
                WaitForSingleObject(hPrint,INFINITE);
                printf("Il Carro vuole andare! Peso attuale: %d\n",PesoAttuale);
                ReleaseMutex(hPrint);
                hNow = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Carro,(LPVOID) &(A), CREATE_SUSPENDED,NULL);
                c++;
                do{ // Inizia il ciclo per il controllo Peso
                    if(PesoAttuale+PESOC<MAXPESO) { // Controllo peso: OK
                        ResumeThread(hNow);
                        break;
                    } else { // Controllo Peso: NOK
                        count++;
                        WaitForSingleObject(hPrint,INFINITE);
                        printf("Peso Massimo raggiunto, Aspetto! Peso Attuale: %d - Ho aspettato %d volte\n", PesoAttuale,count);
                        ReleaseMutex(hPrint);
                        Sleep(10000); // Aspetto un pochito! =)
                        continue;
                    }
                }while(1); count =0; // Fine del ciclo di controllo Peso
            } else { // La destinazione è RITORNO se il GetRandom ritorna 0
                WaitForSingleObject(hPrint,INFINITE);
                printf("Il Carro vuole tornare! Peso attuale: %d\n",PesoAttuale);
                ReleaseMutex(hPrint);
                hNow = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Carro,(LPVOID) &(R), CREATE_SUSPENDED,NULL);
                c++;
                do{ // Inizia il ciclo per il controllo Peso
                    if(PesoAttuale+PESOC<MAXPESO) { // Controllo peso: OK
                        ResumeThread(hNow);
                        break;
                    } else { // Controllo Peso: NOK
                        count++;
                        WaitForSingleObject(hPrint,INFINITE);
                        printf("Peso Massimo raggiunto, Aspetto! Peso Attuale: %d - Ho aspettato %d volte\n", PesoAttuale,count);
                        ReleaseMutex(hPrint);
                        Sleep(10000); // Aspetto un pochito! =)
                        continue;
                    }
                }while(1); count =0; // Fine del ciclo di controllo Peso
            }
           
        } else { // Creo un Pedone se GetRandom ritorna 0
            if(GetRandom(0,1)){ // La destinazione è ANDATA se il GetRandom ritorna 1
                WaitForSingleObject(hPrint,INFINITE);
                printf("Il Pedone vuole andare! Peso attuale: %d\n",PesoAttuale);
                ReleaseMutex(hPrint);
                hNow = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Pedone,(LPVOID) &(A), CREATE_SUSPENDED,NULL);
                c++;
                do{ // Inizia il ciclo per il controllo Peso
                    if(PesoAttuale+PESOP<MAXPESO) { // Controllo peso: OK
                        ResumeThread(hNow);
                        break;
                    } else { // Controllo Peso: NOK
                        count++;
                        WaitForSingleObject(hPrint,INFINITE);
                        printf("Peso Massimo raggiunto, Aspetto! Peso Attuale: %d - Ho aspettato %d volte\n", PesoAttuale,count);
                        ReleaseMutex(hPrint);
                        Sleep(10000); // Aspetto un pochito! =)
                        continue;
                    }
                }while(1); count =0; // Fine del ciclo di controllo Peso
            } else { // La destinazione è RITORNO se il GetRandom ritorna 1
                WaitForSingleObject(hPrint,INFINITE);
                printf("Il Pedone vuole tornare! Peso attuale: %d\n",PesoAttuale);
                ReleaseMutex(hPrint);
                hNow = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Pedone,(LPVOID) &(R), CREATE_SUSPENDED,NULL);
                c++;
                do{ // Inizia il ciclo per il controllo Peso
                    if(PesoAttuale+PESOP<MAXPESO) { // Controllo peso: OK
                        ResumeThread(hNow);
                        break;
                    } else { // Controllo Peso: NOK
                        count++;
                        WaitForSingleObject(hPrint,INFINITE);
                        printf("Peso Massimo raggiunto, Aspetto! Peso Attuale: %d - Ho aspettato %d volte\n", PesoAttuale,count);
                        ReleaseMutex(hPrint);
                        Sleep(10000); // Aspetto un pochito! =)
                        continue;
                    }
                }while(1); count =0; // Fine del ciclo di controllo Peso
            }
        }
    } while(getch()!='q')// Fine del ciclo di creazione Thread!!! :|
    printf("\n*) Numero Persone sulle corsie: %d\n*) Peso Attuale: %d\nHo creato %d thread!\n\n",Persone[0]+Persone[1],PesoAttuale,c); // Riassuntino finale
}
void Pedone(LPDWORD lpdparm){
    DWORD result; // Variabile per il risultato dei Wait.
    int nCorsia;  // Numero corsia assegnata
    int dst = *(int *) lpdparm; // Destinazione del viaggio
   
    if(dst==0) { // Caso destinazione ANDATA
        // Assegno un numero di corsia.
        result = WaitForMultipleObjects(2,hCorsiaR,false,INFINITE);
        nCorsia = result - WAIT_OBJECT_0 +1;
        // Caso in cui non vi siano persone sulla stessa corsia
        if(Persone[nCorsia-1]==0) WaitForSingleObject(hCorsiaA[nCorsia-1],INFINITE); // Occupo la corsia di andata.
        // Rilascio quella di ritorno. Permetto ad altri di procedere nello stesso senso
        ReleaseSemaphore(hCorsiaR[nCorsia-1],1,NULL);
        WaitForSingleObject(hPeso,INFINITE);
        PesoAttuale+=PESOP; // Una persona in più --> Aumento Peso
        ReleaseMutex(hPeso);
        WaitForSingleObject(hPersone,INFINITE);
        Persone[nCorsia-1]++; // Una persona in più --> Aumento Persone sulla corsia.
        ReleaseMutex(hPersone);
        WaitForSingleObject(hPrint,INFINITE);
        printf("Il Pedone e' partito (ANDATA). Numero Corsia: %d\n",nCorsia);
        ReleaseMutex(hPrint);
        Sleep(5000); // Persona in viaggio di ANDATA
        WaitForSingleObject(hPrint,INFINITE);
        printf("Il Pedone e' arrivato(ANDATA). Numero Corsia: %d\n",nCorsia);
        ReleaseMutex(hPrint);
        WaitForSingleObject(hPersone,INFINITE);
        Persone[nCorsia-1]--; // Una persona in meno --> Diminuisco Persone sulla corsia
        ReleaseMutex(hPersone);
        WaitForSingleObject(hPeso,INFINITE);
        PesoAttuale-=PESOP; // Una persona in meno --> Diminuisco Peso
        ReleaseMutex(hPeso);
        // Caso in cui non vi siano persone sulla corsia
        // Rilascio la corsia di andata. Permetto ad altri di tornare.
        if(Persone[nCorsia-1]==0) ReleaseSemaphore(hCorsiaA[nCorsia-1],1,NULL);
        WaitForSingleObject(hPrint,INFINITE);
        // Riassuntino... =)
        printf("\n*) Numero Persone sulle corsie: %d\n*) Peso Attuale: %d\n\n",Persone[0]+Persone[1],PesoAttuale);
        ReleaseMutex(hPrint);
    }
    else { // Caso destinazione RITORNO
        // Assegno un numero di corsia.
        result = WaitForMultipleObjects(2,hCorsiaA,false,INFINITE);
        nCorsia = result - WAIT_OBJECT_0+1;
        // Caso in cui non vi siano persone sulla stessa corsia
        if(Persone[nCorsia-1]==0) WaitForSingleObject(hCorsiaR[nCorsia-1],INFINITE)// Occupo la corsia di ritorno
        // Rilascio quella di andata. Permetto ad altri di procedere nello stesso senso
        ReleaseSemaphore(hCorsiaA[nCorsia-1],1,NULL);
       
        WaitForSingleObject(hPersone,INFINITE);
        Persone[nCorsia-1]++; // Una persona in più --> Aumento Peso
        ReleaseMutex(hPersone);
        WaitForSingleObject(hPeso,INFINITE);
        PesoAttuale+=PESOP; // Una persona in più --> Aumento Persone sulla corsia.
        ReleaseMutex(hPeso);
       
        WaitForSingleObject(hPrint,INFINITE);
        printf("Il Pedone e' partito (RITORNO). Numero Corsia: %d\n",nCorsia);
        ReleaseMutex(hPrint);
        Sleep(5000); // Persona in viaggio di RITORNO
        WaitForSingleObject(hPrint,INFINITE);
        printf("Il Pedone e' arrivato(RITORNO). Numero Corsia: %d\n",nCorsia);
        ReleaseMutex(hPrint);
        WaitForSingleObject(hPersone,INFINITE);
        Persone[nCorsia-1]--; // Una persona in meno --> Diminuisco Persone sulla corsia
        ReleaseMutex(hPersone);
        WaitForSingleObject(hPeso,INFINITE);
        PesoAttuale-=PESOP; // Una persona in meno --> Diminuisco Peso
        ReleaseMutex(hPeso);
        // Caso in cui non vi siano persone sulla corsia
        // Rilascio la corsia di ritorno. Permetto ad altri di andare.
        if(Persone[nCorsia-1]==0) ReleaseSemaphore(hCorsiaR[nCorsia-1],1,NULL);
        WaitForSingleObject(hPrint,INFINITE);
        // Riassuntino... =)
        printf("\n*) Numero Persone sulle corsie: %d\n*) Peso Attuale: %d\n\n",Persone[0]+Persone[1],PesoAttuale);
        ReleaseMutex(hPrint);
    }
   
}
void Carro(LPDWORD lpdparm){
    DWORD result; // In questo caso è superfluo
    int dst = *(int *) lpdparm; // Destinazione del viaggio
   
    if(dst==0) { // Caso destinazione ANDATA
        // Occupo entrambe le corsie.
        result = WaitForMultipleObjects(2,hCorsiaR,true,INFINITE);
        if(Persone[0] == 0) WaitForSingleObject(hCorsiaA[0],INFINITE);
        if(Persone[1] == 0) WaitForSingleObject(hCorsiaA[1],INFINITE);
        // Rilascio entrambe le corsie di ritorno per permettere ad altri di accodarsi.
        ReleaseSemaphore(hCorsiaR[0],1,NULL);
        ReleaseSemaphore(hCorsiaR[1],1,NULL);
        WaitForSingleObject(hPeso,INFINITE);
        PesoAttuale+=PESOC; // Aggiungo il peso di un Carro
        ReleaseMutex(hPeso);
       
        WaitForSingleObject(hPersone,INFINITE);
        // Un carro vale due persone!!! Aggiungo due persone
        Persone[0]++;
        Persone[1]++;
        ReleaseMutex(hPersone);
               
        WaitForSingleObject(hPrint,INFINITE);
        printf("Il Carro e' partito (ANDATA).\n");
        ReleaseMutex(hPrint);
        Sleep(5000); // Carro in viaggio di ANDATA
        WaitForSingleObject(hPrint,INFINITE);
        printf("Il Carro e' arrivato(ANDATA).\n");
        ReleaseMutex(hPrint);
        WaitForSingleObject(hPersone,INFINITE);
        // Un carro vale due persone!!! Tolgo due persone
        Persone[0]--;
        Persone[1]--;
        ReleaseMutex(hPersone);
        WaitForSingleObject(hPeso,INFINITE);
        PesoAttuale-=PESOC; // Tolgo il Peso di un Carro
        ReleaseMutex(hPeso);
        // Caso in cui non ci son persone in entrambe le corsie
        // Rilascio entrambe le corsie di andata, per permettere ad altri di tornare.
        if(Persone[0]==0) ReleaseSemaphore(hCorsiaA[0],1,NULL);
        if(Persone[1]==0) ReleaseSemaphore(hCorsiaA[1],1,NULL);
       
        WaitForSingleObject(hPrint,INFINITE);
        // Riassuntino... =)
        printf("\n*) Numero Persone sulle corsie: %d\n*) Peso Attuale: %d\n\n",Persone[0]+Persone[1],PesoAttuale);
        ReleaseMutex(hPrint);
    }
    else { // Caso destinazione RITORNO
        // Occupo entrambe le corsie.
        result = WaitForMultipleObjects(2,hCorsiaA,true,INFINITE);
        if(Persone[0] == 0) WaitForSingleObject(hCorsiaR[0],INFINITE);
        if(Persone[1] == 0) WaitForSingleObject(hCorsiaR[1],INFINITE);
       
        WaitForSingleObject(hPeso,INFINITE);
        PesoAttuale+=PESOC; // Aggiungo il peso di un Carro
        ReleaseMutex(hPeso);
       
        WaitForSingleObject(hPersone,INFINITE);
        // Un carro vale due persone!!! Aggiungo due persone
        Persone[0]++;
        Persone[1]++;
        ReleaseMutex(hPersone);
       
        // Rilascio entramebe le corsie di andata per permettere ad altri di accodarsi.
        ReleaseSemaphore(hCorsiaA[0],1,NULL);
        ReleaseSemaphore(hCorsiaA[1],1,NULL);
       
        WaitForSingleObject(hPrint,INFINITE);
        printf("Il Carro e' partito (RITORNO).\n");
        ReleaseMutex(hPrint);
        Sleep(5000); // Carro in viaggio di RITORNO
        WaitForSingleObject(hPrint,INFINITE);
        printf("Il Carro e' arrivato(RITORNO).\n");
        ReleaseMutex(hPrint);
        WaitForSingleObject(hPersone,INFINITE);
        // Un carro vale due persone!!! Tolgo due persone
        Persone[0]--;
        Persone[1]--;
        ReleaseMutex(hPersone);
        WaitForSingleObject(hPeso,INFINITE);
        PesoAttuale-=PESOC; // Tolgo il Peso di un Carro
        ReleaseMutex(hPeso);
        // Caso in cui non ci son persone in entrambe le corsie
        // Caso in cui non ci son persone in entrambe le corsie
        // Rilascio entrambe le corsie di andata, per permettere ad altri di tornare.
        if(Persone[0]==0) ReleaseSemaphore(hCorsiaR[0],1,NULL);
        if(Persone[1]==0) ReleaseSemaphore(hCorsiaR[1],1,NULL);
        WaitForSingleObject(hPrint,INFINITE);
        // Riassuntino... =)
        printf("\n*) Numero Persone sulle corsie: %d\n*) Peso Attuale: %d\n\n",Persone[0]+Persone[1],PesoAttuale);
        ReleaseMutex(hPrint);
    }
   
   
}




Modificato il 2006-06-07 12:55:38 da GiPPe

Aggiunzioni:
%%

Omissioni:
%(c)



Modificato il 2006-06-07 12:53:00 da GiPPe

Aggiunzioni:
%%(c)
%(c)


Omissioni:
}'



Modificato il 2006-06-07 12:52:30 da GiPPe

Aggiunzioni:
}'

Omissioni:
%%(c)
}




Modificato il 2006-06-07 12:51:51 da GiPPe

Aggiunzioni:
}



Modificato il 2006-06-07 12:50:37 da GiPPe

Aggiunzioni:
#define PESOP 150 Peso di una persona Standard
#define RITORNO 1
RITORNO
int PesoAttuale = 0; Var. Glob. per il Peso Attuale sul ponte
NB: Ho utilizzato i semafori per essere sicuro di ottenere il numero di corsia giusto all'interno dei thread.
hCorsiaA[i] = CreateSemaphore(NULL,1,1,NULL);
hCorsiaR[i] = CreateSemaphore(NULL,1,1,NULL);
if(GetRandom(0,1)) { Creo un Carro se GetRandom ritorna 1
if(GetRandom(0,1)){
La destinazione è ANDATA se il GetRandom ritorna 1
WaitForSingleObject(hPrint,INFINITE);
printf("Il Carro vuole andare! Peso attuale: %d\n",PesoAttuale);
ReleaseMutex(hPrint);
hNow = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Carro,(LPVOID) &(A), CREATE_SUSPENDED,NULL);
c;
do{ Inizia il ciclo per il controllo Peso
if(PesoAttuale+PESOC<MAXPESO) {
Controllo peso: OK
ResumeThread(hNow);
break;
} else { Controllo Peso: NOK
count
;
WaitForSingleObject(hPrint,INFINITE);
printf("Peso Massimo raggiunto, Aspetto! Peso Attuale: %d - Ho aspettato %d volte\n", PesoAttuale,count);
ReleaseMutex(hPrint);
Sleep(10000);
Aspetto un pochito! =)
continue;
}
}while(1); count =0; Fine del ciclo di controllo Peso
} else {
La destinazione è RITORNO se il GetRandom ritorna 0
WaitForSingleObject(hPrint,INFINITE);
printf("Il Carro vuole tornare! Peso attuale: %d\n",PesoAttuale);
ReleaseMutex(hPrint);
hNow = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Carro,(LPVOID) &(R), CREATE_SUSPENDED,NULL);
c;
do{ Inizia il ciclo per il controllo Peso
if(PesoAttuale+PESOC<MAXPESO) {
Controllo peso: OK
ResumeThread(hNow);
break;
} else { Controllo Peso: NOK
count
;
WaitForSingleObject(hPrint,INFINITE);
printf("Peso Massimo raggiunto, Aspetto! Peso Attuale: %d - Ho aspettato %d volte\n", PesoAttuale,count);
ReleaseMutex(hPrint);
Sleep(10000);
Aspetto un pochito! =)
continue;
}
}while(1); count =0; Fine del ciclo di controllo Peso
}

} else {
Creo un Pedone se GetRandom ritorna 0
if(GetRandom(0,1)){ La destinazione è ANDATA se il GetRandom ritorna 1
WaitForSingleObject(hPrint,INFINITE);
printf("Il Pedone vuole andare! Peso attuale: %d\n",PesoAttuale);
ReleaseMutex(hPrint);
hNow = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Pedone,(LPVOID) &(A), CREATE_SUSPENDED,NULL);
c;
do{
Inizia il ciclo per il controllo Peso
if(PesoAttuale+PESOP<MAXPESO) { Controllo peso: OK
ResumeThread(hNow);
break;
} else {
Controllo Peso: NOK
count;
WaitForSingleObject(hPrint,INFINITE);
printf("Peso Massimo raggiunto, Aspetto! Peso Attuale: %d - Ho aspettato %d volte\n", PesoAttuale,count);
ReleaseMutex(hPrint);
Sleep(10000); Aspetto un pochito! =)
continue;
}
}while(1); count =0;
Fine del ciclo di controllo Peso
} else { La destinazione è RITORNO se il GetRandom ritorna 1
WaitForSingleObject(hPrint,INFINITE);
printf("Il Pedone vuole tornare! Peso attuale: %d\n",PesoAttuale);
ReleaseMutex(hPrint);
hNow = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Pedone,(LPVOID) &(R), CREATE_SUSPENDED,NULL);
c;
do{
Inizia il ciclo per il controllo Peso
if(PesoAttuale+PESOP<MAXPESO) { Controllo peso: OK
ResumeThread(hNow);
break;
} else {
Controllo Peso: NOK
count;
WaitForSingleObject(hPrint,INFINITE);
printf("Peso Massimo raggiunto, Aspetto! Peso Attuale: %d - Ho aspettato %d volte\n", PesoAttuale,count);
ReleaseMutex(hPrint);
Sleep(10000); Aspetto un pochito! =)
continue;
}
}while(1); count =0;
Fine del ciclo di controllo Peso
}
}
Assegno un numero di corsia.
result = WaitForMultipleObjects(2,hCorsiaR,false,INFINITE);
nCorsia = result - WAIT_OBJECT_0 +1;
Caso in cui non vi siano persone sulla stessa corsia
if(Persone[nCorsia-1]
0) WaitForSingleObject(hCorsiaA[nCorsia-1],INFINITE); Occupo la corsia di andata. ReleaseSemaphore(hCorsiaR[nCorsia-1],1,NULL);
WaitForSingleObject(hPeso,INFINITE);
PesoAttuale+=PESOP;
Una persona in più --> Aumento Peso
ReleaseMutex(hPeso);
WaitForSingleObject(hPersone,INFINITE);
Persone[nCorsia-1]; Una persona in più --> Aumento Persone sulla corsia.
ReleaseMutex(hPersone);
WaitForSingleObject(hPrint,INFINITE);
printf("Il Pedone e' partito (ANDATA). Numero Corsia: %d\n",nCorsia);
ReleaseMutex(hPrint);
Sleep(5000);
Persona in viaggio di ANDATA
WaitForSingleObject(hPrint,INFINITE);
printf("Il Pedone e' arrivato(ANDATA). Numero Corsia: %d\n",nCorsia);
ReleaseMutex(hPrint);
WaitForSingleObject(hPersone,INFINITE);
Persone[nCorsia-1]--; Una persona in meno --> Diminuisco Persone sulla corsia
ReleaseMutex(hPersone);
WaitForSingleObject(hPeso,INFINITE);
PesoAttuale-=PESOP;
Una persona in meno --> Diminuisco Peso
ReleaseMutex(hPeso);
Caso in cui non vi siano persone sulla corsia
Rilascio la corsia di andata. Permetto ad altri di tornare.
if(Persone[nCorsia-1]
0) ReleaseSemaphore(hCorsiaA[nCorsia-1],1,NULL); WaitForSingleObject(hPrint,INFINITE);
Riassuntino... =)
printf("\n*) Numero Persone sulle corsie: %d\n*) Peso Attuale: %d\n\n",Persone[0]+Persone[1],PesoAttuale);
ReleaseMutex(hPrint);
Assegno un numero di corsia.
result = WaitForMultipleObjects(2,hCorsiaA,false,INFINITE);
nCorsia = result - WAIT_OBJECT_0+1;
Caso in cui non vi siano persone sulla stessa corsia
if(Persone[nCorsia-1]
0) WaitForSingleObject(hCorsiaR[nCorsia-1],INFINITE); Occupo la corsia di ritorno Rilascio quella di andata. Permetto ad altri di procedere nello stesso senso
ReleaseSemaphore(hCorsiaA[nCorsia-1],1,NULL);
WaitForSingleObject(hPersone,INFINITE);
Persone[nCorsia-1];
Una persona in più --> Aumento Peso
ReleaseMutex(hPersone);
WaitForSingleObject(hPeso,INFINITE);
PesoAttuale+=PESOP; Una persona in più --> Aumento Persone sulla corsia.
ReleaseMutex(hPeso);

WaitForSingleObject(hPrint,INFINITE);
printf("Il Pedone e' partito (RITORNO). Numero Corsia: %d\n",nCorsia);
ReleaseMutex(hPrint);
Sleep(5000);
Persona in viaggio di RITORNO
WaitForSingleObject(hPrint,INFINITE);
printf("Il Pedone e' arrivato(RITORNO). Numero Corsia: %d\n",nCorsia);
ReleaseMutex(hPrint);
WaitForSingleObject(hPersone,INFINITE);
Persone[nCorsia-1]--; Una persona in meno --> Diminuisco Persone sulla corsia
ReleaseMutex(hPersone);
WaitForSingleObject(hPeso,INFINITE);
PesoAttuale-=PESOP;
Una persona in meno --> Diminuisco Peso
ReleaseMutex(hPeso);
Caso in cui non vi siano persone sulla corsia
Rilascio la corsia di ritorno. Permetto ad altri di andare.
if(Persone[nCorsia-1]
0) ReleaseSemaphore(hCorsiaR[nCorsia-1],1,NULL); WaitForSingleObject(hPrint,INFINITE);
Riassuntino... =)
printf("\n*) Numero Persone sulle corsie: %d\n*) Peso Attuale: %d\n\n",Persone[0]+Persone[1],PesoAttuale);
ReleaseMutex(hPrint);
Occupo entrambe le corsie.
result = WaitForMultipleObjects(2,hCorsiaR,true,INFINITE);
if(Persone[0]
0) WaitForSingleObject(hCorsiaA[0],INFINITE); if(Persone[1]
0) WaitForSingleObject(hCorsiaA[1],INFINITE);
ReleaseSemaphore(hCorsiaR[0],1,NULL);
ReleaseSemaphore(hCorsiaR[1],1,NULL);
PesoAttuale+=PESOC; Aggiungo il peso di un Carro
ReleaseMutex(hPeso);
WaitForSingleObject(hPersone,INFINITE);
Un carro vale due persone!!! Aggiungo due persone
Persone[0];
Persone[1]
;
ReleaseMutex(hPersone);

WaitForSingleObject(hPrint,INFINITE);
printf("Il Carro e' partito (ANDATA).\n");
ReleaseMutex(hPrint);
Sleep(5000); Carro in viaggio di ANDATA
WaitForSingleObject(hPrint,INFINITE);
printf("Il Carro e' arrivato(ANDATA).\n");
ReleaseMutex(hPrint);
WaitForSingleObject(hPersone,INFINITE);
Un carro vale due persone!!! Tolgo due persone
Persone[0]--;
Persone[1]--;
ReleaseMutex(hPersone);
WaitForSingleObject(hPeso,INFINITE);
PesoAttuale-=PESOC; Tolgo il Peso di un Carro
ReleaseMutex(hPeso);
Caso in cui non ci son persone in entrambe le corsie
Rilascio entrambe le corsie di andata, per permettere ad altri di tornare.
if(Persone[0]
0) ReleaseSemaphore(hCorsiaA[0],1,NULL); if(Persone[1]
0) ReleaseSemaphore(hCorsiaA[1],1,NULL); WaitForSingleObject(hPrint,INFINITE);
Riassuntino... =)
printf("\n*) Numero Persone sulle corsie: %d\n*) Peso Attuale: %d\n\n",Persone[0]+Persone[1],PesoAttuale);
ReleaseMutex(hPrint);
Occupo entrambe le corsie.
result = WaitForMultipleObjects(2,hCorsiaA,true,INFINITE);
if(Persone[0]
0) WaitForSingleObject(hCorsiaR[0],INFINITE); if(Persone[1]
0) WaitForSingleObject(hCorsiaR[1],INFINITE);

WaitForSingleObject(hPeso,INFINITE);
PesoAttuale+=PESOC;
Aggiungo il peso di un Carro
ReleaseMutex(hPeso);
WaitForSingleObject(hPersone,INFINITE);
Un carro vale due persone!!! Aggiungo due persone
Persone[0];
Persone[1]
;
ReleaseMutex(hPersone);
Rilascio entramebe le corsie di andata per permettere ad altri di accodarsi.
ReleaseSemaphore(hCorsiaA[0],1,NULL);
ReleaseSemaphore(hCorsiaA[1],1,NULL);
WaitForSingleObject(hPrint,INFINITE);
printf("Il Carro e' partito (RITORNO).\n");
ReleaseMutex(hPrint);
Sleep(5000); Carro in viaggio di RITORNO
WaitForSingleObject(hPrint,INFINITE);
printf("Il Carro e' arrivato(RITORNO).\n");
ReleaseMutex(hPrint);
WaitForSingleObject(hPersone,INFINITE);
Un carro vale due persone!!! Tolgo due persone
Persone[0]--;
Persone[1]--;
ReleaseMutex(hPersone);
WaitForSingleObject(hPeso,INFINITE);
PesoAttuale-=PESOC; Tolgo il Peso di un Carro
ReleaseMutex(hPeso);
Caso in cui non ci son persone in entrambe le corsie
Caso in cui non ci son persone in entrambe le corsie
Rilascio entrambe le corsie di andata, per permettere ad altri di tornare.
if(Persone[0]
0) ReleaseSemaphore(hCorsiaR[0],1,NULL); if(Persone[1]
0) ReleaseSemaphore(hCorsiaR[1],1,NULL); WaitForSingleObject(hPrint,INFINITE);
Riassuntino... =)
printf("\n*) Numero Persone sulle corsie: %d\n*) Peso Attuale: %d\n\n",Persone[0]+Persone[1],PesoAttuale);
ReleaseMutex(hPrint);


Omissioni:
#define PESOP 150 Peso di una persona Standard
#define RITORNO 1 RITORNO
int PesoAttuale = 0; Var. Glob. per il Peso Attuale sul ponte
NB: Ho utilizzato i semafori per essere sicuro di ottenere il numero di corsia giusto all'interno dei thread.
hCorsiaA[i] = CreateSemaphore(NULL,1,1,NULL);
hCorsiaR[i] = CreateSemaphore(NULL,1,1,NULL);
if(GetRandom(0,1)) { Creo un Carro se GetRandom ritorna 1
if(GetRandom(0,1)){ La destinazione è ANDATA se il GetRandom ritorna 1
WaitForSingleObject(hPrint,INFINITE);
printf("Il Carro vuole andare! Peso attuale: %d\n",PesoAttuale);
ReleaseMutex(hPrint);
hNow = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Carro,(LPVOID) &(A), CREATE_SUSPENDED,NULL);
c;
do{ Inizia il ciclo per il controllo Peso
if(PesoAttuale+PESOC<MAXPESO) { Controllo peso: OK
ResumeThread(hNow);
break;
} else { Controllo Peso: NOK
count;
WaitForSingleObject(hPrint,INFINITE);
printf("Peso Massimo raggiunto, Aspetto! Peso Attuale: %d - Ho aspettato %d volte\n", PesoAttuale,count);
ReleaseMutex(hPrint);
Sleep(10000);
Aspetto un pochito! =)
continue;
}
}while(1); count =0; Fine del ciclo di controllo Peso
} else { La destinazione è RITORNO se il GetRandom ritorna 0
WaitForSingleObject(hPrint,INFINITE);
printf("Il Carro vuole tornare! Peso attuale: %d\n",PesoAttuale);
ReleaseMutex(hPrint);
hNow = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Carro,(LPVOID) &(R), CREATE_SUSPENDED,NULL);
c;
do{ Inizia il ciclo per il controllo Peso
if(PesoAttuale+PESOC<MAXPESO) { Controllo peso: OK
ResumeThread(hNow);
break;
} else { Controllo Peso: NOK
count;
WaitForSingleObject(hPrint,INFINITE);
printf("Peso Massimo raggiunto, Aspetto! Peso Attuale: %d - Ho aspettato %d volte\n", PesoAttuale,count);
ReleaseMutex(hPrint);
Sleep(10000);
Aspetto un pochito! =)
continue;
}
}while(1); count =0; Fine del ciclo di controllo Peso
}

} else { Creo un Pedone se GetRandom ritorna 0
if(GetRandom(0,1)){ La destinazione è ANDATA se il GetRandom ritorna 1
WaitForSingleObject(hPrint,INFINITE);
printf("Il Pedone vuole andare! Peso attuale: %d\n",PesoAttuale);
ReleaseMutex(hPrint);
hNow = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Pedone,(LPVOID) &(A), CREATE_SUSPENDED,NULL);
c;
do{
Inizia il ciclo per il controllo Peso
if(PesoAttuale+PESOP<MAXPESO) { Controllo peso: OK
ResumeThread(hNow);
break;
} else {
Controllo Peso: NOK
count;
WaitForSingleObject(hPrint,INFINITE);
printf("Peso Massimo raggiunto, Aspetto! Peso Attuale: %d - Ho aspettato %d volte\n", PesoAttuale,count);
ReleaseMutex(hPrint);
Sleep(10000); Aspetto un pochito! =)
continue;
}
}while(1); count =0; Fine del ciclo di controllo Peso
} else { La destinazione è RITORNO se il GetRandom ritorna 1
WaitForSingleObject(hPrint,INFINITE);
printf("Il Pedone vuole tornare! Peso attuale: %d\n",PesoAttuale);
ReleaseMutex(hPrint);
hNow = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Pedone,(LPVOID) &(R), CREATE_SUSPENDED,NULL);
c;
do{
Inizia il ciclo per il controllo Peso
if(PesoAttuale+PESOP<MAXPESO) { Controllo peso: OK
ResumeThread(hNow);
break;
} else {
Controllo Peso: NOK
count;
WaitForSingleObject(hPrint,INFINITE);
printf("Peso Massimo raggiunto, Aspetto! Peso Attuale: %d - Ho aspettato %d volte\n", PesoAttuale,count);
ReleaseMutex(hPrint);
Sleep(10000); Aspetto un pochito! =)
continue;
}
}while(1); count =0; Fine del ciclo di controllo Peso
}
}
Assegno un numero di corsia.
result = WaitForMultipleObjects(2,hCorsiaR,false,INFINITE);
nCorsia = result - WAIT_OBJECT_0 +1;
Caso in cui non vi siano persone sulla stessa corsia
if(Persone[nCorsia-1]
0) WaitForSingleObject(hCorsiaA[nCorsia-1],INFINITE); Occupo la corsia di andata. PesoAttuale+=PESOP; Una persona in più --> Aumento Peso
ReleaseMutex(hPeso);
WaitForSingleObject(hPersone,INFINITE);
Persone[nCorsia-1]; Una persona in più --> Aumento Persone sulla corsia.
ReleaseMutex(hPersone);
ReleaseSemaphore(hCorsiaR[nCorsia-1],1,NULL);
WaitForSingleObject(hPrint,INFINITE);
printf("Il Pedone e' partito (ANDATA). Numero Corsia: %d\n",nCorsia);
ReleaseMutex(hPrint);
Sleep(5000);
Persona in viaggio di ANDATA
WaitForSingleObject(hPrint,INFINITE);
printf("Il Pedone e' arrivato(ANDATA). Numero Corsia: %d\n",nCorsia);
ReleaseMutex(hPrint);
WaitForSingleObject(hPersone,INFINITE);
Persone[nCorsia-1]--; Una persona in meno --> Diminuisco Persone sulla corsia
ReleaseMutex(hPersone);
PesoAttuale-=PESOP;
Una persona in meno --> Diminuisco Peso
ReleaseMutex(hPeso);
Caso in cui non vi siano persone sulla corsia
Rilascio la corsia di andata. Permetto ad altri di tornare.
if(Persone[nCorsia-1]
0) ReleaseSemaphore(hCorsiaA[nCorsia-1],1,NULL); WaitForSingleObject(hPrint,INFINITE);
Riassuntino... =)
printf("\n*) Numero Persone sulle corsie: %d\n*) Peso Attuale: %d\n\n",Persone[0]+Persone[1],PesoAttuale);
ReleaseMutex(hPrint);
Assegno un numero di corsia.
result = WaitForMultipleObjects(2,hCorsiaA,false,INFINITE);
nCorsia = result - WAIT_OBJECT_0+1;
Caso in cui non vi siano persone sulla stessa corsia
if(Persone[nCorsia-1]
0) WaitForSingleObject(hCorsiaR[nCorsia-1],INFINITE); Occupo la corsia di ritorno WaitForSingleObject(hPersone,INFINITE);
Persone[nCorsia-1]; Una persona in più --> Aumento Peso
ReleaseMutex(hPersone);
PesoAttuale+=PESOP;
Una persona in più --> Aumento Persone sulla corsia.
ReleaseMutex(hPeso);
Rilascio quella di andata. Permetto ad altri di procedere nello stesso senso
ReleaseSemaphore(hCorsiaA[nCorsia-1],1,NULL);
WaitForSingleObject(hPrint,INFINITE);
printf("Il Pedone e' partito (RITORNO). Numero Corsia: %d\n",nCorsia);
ReleaseMutex(hPrint);
Sleep(5000);
Persona in viaggio di RITORNO
WaitForSingleObject(hPrint,INFINITE);
printf("Il Pedone e' arrivato(RITORNO). Numero Corsia: %d\n",nCorsia);
ReleaseMutex(hPrint);
WaitForSingleObject(hPersone,INFINITE);
Persone[nCorsia-1]--; Una persona in meno --> Diminuisco Persone sulla corsia
ReleaseMutex(hPersone);
PesoAttuale-=PESOP;
Una persona in meno --> Diminuisco Peso
ReleaseMutex(hPeso);
Caso in cui non vi siano persone sulla corsia
Rilascio la corsia di ritorno. Permetto ad altri di andare.
if(Persone[nCorsia-1]
0) ReleaseSemaphore(hCorsiaR[nCorsia-1],1,NULL); WaitForSingleObject(hPrint,INFINITE);
Riassuntino... =)
printf("\n*) Numero Persone sulle corsie: %d\n*) Peso Attuale: %d\n\n",Persone[0]+Persone[1],PesoAttuale);
ReleaseMutex(hPrint);
Occupo entrambe le corsie.
result = WaitForMultipleObjects(2,hCorsiaR,true,INFINITE);
Se non ci sono persone su entrambe le corsie, occupo entrambe di andata.
if(Persone[0]
0 && Persone[1]
0) WaitForMultipleObjects(2,hCorsiaA,true,INFINITE); PesoAttuale+=PESOC;
Aggiungo il peso di un Carro
ReleaseMutex(hPeso);
WaitForSingleObject(hPersone,INFINITE);
Un carro vale due persone!!! Aggiungo due persone
Persone[0];
Persone[1]
;
ReleaseMutex(hPersone);
ReleaseSemaphore(hCorsiaR[0],1,NULL);
ReleaseSemaphore(hCorsiaR[1],1,NULL);
WaitForSingleObject(hPrint,INFINITE);
printf("Il Carro e' partito (ANDATA).\n");
ReleaseMutex(hPrint);
Sleep(5000);
Carro in viaggio di ANDATA
WaitForSingleObject(hPrint,INFINITE);
printf("Il Carro e' arrivato(ANDATA).\n");
ReleaseMutex(hPrint);
WaitForSingleObject(hPersone,INFINITE);
Un carro vale due persone!!! Tolgo due persone
Persone[0]--;
Persone[1]--;
ReleaseMutex(hPersone);
PesoAttuale-=PESOC;
Tolgo il Peso di un Carro
ReleaseMutex(hPeso);
Caso in cui non ci son persone in entrambe le corsie
if(Persone[0]
0 && Persone[1]
0) {
Rilascio entrambe le corsie di andata, per permettere ad altri di tornare.
ReleaseSemaphore(hCorsiaA[0],1,NULL);
ReleaseSemaphore(hCorsiaA[1],1,NULL);
}
WaitForSingleObject(hPrint,INFINITE);
Riassuntino... =)
printf("\n*) Numero Persone sulle corsie: %d\n*) Peso Attuale: %d\n\n",Persone[0]+Persone[1],PesoAttuale);
ReleaseMutex(hPrint);
Occupo entrambe le corsie.
result = WaitForMultipleObjects(2,hCorsiaA,true,INFINITE);
Se non ci sono persone su entrambe le corsie, occupo entrambe di ritorno.
if(Persone[0]
0 && Persone[1]
0) WaitForMultipleObjects(2,hCorsiaR,true,INFINITE); PesoAttuale+=PESOC;
Aggiungo il peso di un Carro
ReleaseMutex(hPeso);
WaitForSingleObject(hPersone,INFINITE);
Un carro vale due persone!!! Aggiungo due persone
Persone[0];
Persone[1]
;
ReleaseMutex(hPersone);
Rilascio entramebe le corsie di andata per permettere ad altri di accodarsi.
ReleaseSemaphore(hCorsiaA[0],1,NULL);
ReleaseSemaphore(hCorsiaA[1],1,NULL);
WaitForSingleObject(hPrint,INFINITE);
printf("Il Carro e' partito (RITORNO).\n");
ReleaseMutex(hPrint);
Sleep(5000); Carro in viaggio di RITORNO
WaitForSingleObject(hPrint,INFINITE);
printf("Il Carro e' arrivato(RITORNO).\n");
ReleaseMutex(hPrint);
WaitForSingleObject(hPersone,INFINITE);
Un carro vale due persone!!! Tolgo due persone
Persone[0]--;
Persone[1]--;
ReleaseMutex(hPersone);
PesoAttuale-=PESOC; Tolgo il Peso di un Carro
ReleaseMutex(hPeso);
Caso in cui non ci son persone in entrambe le corsie
if(Persone[0]
0 && Persone[1]
0) {
Rilascio entrambe le corsie di ritorno, per permettere ad altri di andare.
ReleaseSemaphore(hCorsiaR[0],1,NULL);
ReleaseSemaphore(hCorsiaR[1],1,NULL);
}
WaitForSingleObject(hPrint,INFINITE);
Riassuntino... =)
printf("\n*) Numero Persone sulle corsie: %d\n*) Peso Attuale: %d\n\n",Persone[0]+Persone[1],PesoAttuale);
ReleaseMutex(hPrint);
%%

Torna a Lab Sistemi Operativi




Modificato il 2006-05-27 14:16:41 da GiPPe

Aggiunzioni:
A volte il programma sembra vada in deadlock...penso sia legato ai timeout...cmq...il 90% delle volte funziona.



Modificato il 2006-05-27 14:09:22 da GiPPe

Aggiunzioni:





Modificato il 2006-05-27 14:08:19 da GiPPe

Omissioni:
do{ Inizia il ciclo per il controllo Peso
if(PesoAttuale+PESOP<MAXPESO) { Controllo peso: OK
ResumeThread(hNow);
break;
} else { Controllo peso: NOK
count;
WaitForSingleObject(hPrint,INFINITE);
printf("Peso Massimo raggiunto, Aspetto! Ho aspettato %d volte\n", count);
ReleaseMutex(hPrint);
Sleep(10000);
Aspetto un pochito! =)
continue;
}
}while(1); count =0; Fine del ciclo di controllo Peso



Modificato il 2006-05-27 14:03:26 da DenteDiLupo

Aggiunzioni:
1. Scrivere il programma Tibet in linguaggio C che abbia le i seguenti processi:

Omissioni:
1. Scrivere il programma Tibet in linguaggio C che abbia le i seguenti processi:





Modificato il 2006-05-27 14:03:13 da DenteDiLupo

Aggiunzioni:
1. Scrivere il programma Tibet in linguaggio C che abbia le i seguenti processi:

  • assenza di deadlock
  • assenza di rotture del ponte
  • assenza di sorpassi e incroci impossibili.

    Omissioni:
    1. Scrivere il programma Tibet in linguaggio C che abbia le i seguenti processi:
  • 1) assenza di deadlock
    1) assenza di rotture del ponte,
    1) assenza di sorpassi e incroci impossibili.




    Modificato il 2006-05-27 14:01:04 da DenteDiLupo

    \Nessuna differenza.


    Modificato il 2006-05-27 14:00:16 da DenteDiLupo

    Aggiunzioni:
    Due villaggi di montagna sono separati da una profonda vallata; per facilitare la comunicazione tra i due villaggi, è stato costruito un ponte tibetano (di corde) che li unisce. Il ponte è abbastanza largo da permettere il passaggio di due pedoni alla volta, eventualmente in direzioni opposte. Il ponte è largo appena a sufficienza per far passare un carro;questo significa che non è possibile che due carri attraversino il ponte contemporaneamente in due direzioni opposte, ed è impossibile superare un carro. Il ponte ha un limite di carico MAXLOAD. Se il peso di tutti i carri e pedoni attualmente presenti sul ponte supera MAXLOAD, il ponte si spezza. E' possibile ottenere il peso di un pedone o carro x con la funzione getWeight(x).
    1. Scrivere il programma Tibet in linguaggio C che abbia le i seguenti processi:
    pEntra(Village src, Persona p);
    pEsci(Village dst, Persona p);
    cEntra(Village src, Carro c);
    cEsci(Village dst, Carro c);
    La vita di un pedone consiste nell'andare da una città all'altra, invocando prima pEntra a partire dalla città di partenza e poi Esci sulla città di arrivo.
    La vita di un carro consiste nell'andare da una città all'altra, invocando prima cEntra a partire dalla città di partenza e poi cEsci sulla città di arrivo.
    Il programma deve soddisfare alle seguenti caratteristiche:
    1) assenza di deadlock
    1) assenza di rotture del ponte,
    1) assenza di sorpassi e incroci impossibili.

    2. Spiegare come le proprietà 1 - 3 sono rispettate dal vostro algoritmo.
    %%(c)


    Omissioni:
    %%(c)



    La versione più vecchia di questa pagina è stata modificata il 2006-05-27 13:58:32 da DenteDiLupo []
    Vista della pagina:

    Problema del Ponte Tibetano

    // L'algoritmo dovrebbe esser corretto, sono tuttavia convinto che ci sia un'anomalia nel controllo del peso.
    // A mio parere sorge dall'utilizzo di un HANDLE temporaneo che ad ogni ciclo viene sovrascritto!
    // Tento di risolvere...inserendo il controllo Peso dopo la creazione di ogni singolo Thread.
    #include <conio.h>
    #include <ctype.h>
    #include <time.h>
    #include <windows.h>
    #include <stdio.h>
    #include <process.h>
    
    #define MAXPESO 1000 // Peso massimo sostenibile dal ponte
    #define PESOP 150	 // Peso di una persona Standard
    #define PESOC 300    // Peso di un carro Standard
    #define ANDATA 0     // ANDATA
    #define RITORNO 1	 // RITORNO
    #define GetRandom(min, max) ((rand() % (int)(((max) +1) - (min))) + (min)) // Funzione di Generazione interi casuali
    
    // Le seguenti variabili globali saranno protette da Mutex!
    int PesoAttuale = 0;	// Var. Glob. per il Peso Attuale sul ponte
    int Persone[2] = {0,0}; // Var. Glob. per il Conteggio Persone sul ponte
    
    // Funzioni Thread.
    void Pedone(LPDWORD lpdwParam); // Un Pedone.
    void Carro(LPDWORD lpdwParam); // Un Carro.
    
    // Handle globali dei semafori e dei mutex: Semafori Corsie, Mutex Var. Glob., Mutex Stream di Output
    HANDLE hCorsiaA[2], hCorsiaR[2], hPeso, hPersone, hPrint;
    
    // Inizia il programmino...=)
    void main() {
    	// Conteggio Thread e cicli di wait per il peso.
    	int c,count = 0; 
    	c= count;
    	// Var. Flag per la destinazione
    	int A = ANDATA; 
    	int R = RITORNO;
    	srand((unsigned)time(NULL)); // Generazione del seed per il rand
    	// Creo i Mutex e i Semafori
    	hPeso = CreateMutex(NULL,false,NULL);
    	hPersone = CreateMutex(NULL,false,NULL);
    	hPrint = CreateMutex(NULL,false,NULL);
    	for( int i = 0; i<2; i++ ) { 
    		// NB: Ho utilizzato i semafori per essere sicuro di ottenere il numero di corsia giusto all'interno dei thread.
    		hCorsiaA[i] = CreateSemaphore(NULL,1,1,NULL);
    		hCorsiaR[i] = CreateSemaphore(NULL,1,1,NULL);
    	}
    	
    	HANDLE hNow; // Handle temporaneo per il resume dei thread.
    	
    	printf("Pressa un tasto per generare un carro o un pitone. q per uscire.\n");
    	// Comincia il ciclo di creazione dei Thread :|
    	do{
    		if(GetRandom(0,1)) {  // Creo un Carro se GetRandom ritorna 1
    			if(GetRandom(0,1)){ // La destinazione è ANDATA se il GetRandom ritorna 1
    				WaitForSingleObject(hPrint,INFINITE);
    				printf("Il Carro vuole andare! Peso attuale: %d\n",PesoAttuale);
    				ReleaseMutex(hPrint);
    				hNow = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Carro,(LPVOID) &(A), CREATE_SUSPENDED,NULL);
    				c++;
    				do{ // Inizia il ciclo per il controllo Peso
    					if(PesoAttuale+PESOC<MAXPESO) { // Controllo peso: OK
    						ResumeThread(hNow);
    						break;
    					} else { // Controllo Peso: NOK
    						count++;
    						WaitForSingleObject(hPrint,INFINITE);
    						printf("Peso Massimo raggiunto, Aspetto! Peso Attuale: %d - Ho aspettato %d volte\n", PesoAttuale,count);
    						ReleaseMutex(hPrint);
    						Sleep(10000); // Aspetto un pochito! =)
    						continue;
    					}
    				}while(1); count =0; // Fine del ciclo di controllo Peso
    			} else { // La destinazione è RITORNO se il GetRandom ritorna 0
    				WaitForSingleObject(hPrint,INFINITE);
    				printf("Il Carro vuole tornare! Peso attuale: %d\n",PesoAttuale);
    				ReleaseMutex(hPrint);
    				hNow = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Carro,(LPVOID) &(R), CREATE_SUSPENDED,NULL);
    				c++;
    				do{ // Inizia il ciclo per il controllo Peso
    					if(PesoAttuale+PESOC<MAXPESO) { // Controllo peso: OK
    						ResumeThread(hNow);
    						break;
    					} else { // Controllo Peso: NOK
    						count++;
    						WaitForSingleObject(hPrint,INFINITE);
    						printf("Peso Massimo raggiunto, Aspetto! Peso Attuale: %d - Ho aspettato %d volte\n", PesoAttuale,count);
    						ReleaseMutex(hPrint);
    						Sleep(10000); // Aspetto un pochito! =)
    						continue;
    					}
    				}while(1); count =0; // Fine del ciclo di controllo Peso
    			}
    			
    		} else { // Creo un Pedone se GetRandom ritorna 0
    			if(GetRandom(0,1)){ // La destinazione è ANDATA se il GetRandom ritorna 1
    				WaitForSingleObject(hPrint,INFINITE);
    				printf("Il Pedone vuole andare! Peso attuale: %d\n",PesoAttuale);
    				ReleaseMutex(hPrint);
    				hNow = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Pedone,(LPVOID) &(A), CREATE_SUSPENDED,NULL);
    				c++;
    				do{ // Inizia il ciclo per il controllo Peso
    					if(PesoAttuale+PESOP<MAXPESO) { // Controllo peso: OK
    						ResumeThread(hNow);
    						break;
    					} else { // Controllo Peso: NOK
    						count++;
    						WaitForSingleObject(hPrint,INFINITE);
    						printf("Peso Massimo raggiunto, Aspetto! Peso Attuale: %d - Ho aspettato %d volte\n", PesoAttuale,count);
    						ReleaseMutex(hPrint);
    						Sleep(10000); // Aspetto un pochito! =)
    						continue;
    					}
    				}while(1); count =0; // Fine del ciclo di controllo Peso
    			} else { // La destinazione è RITORNO se il GetRandom ritorna 1
    				WaitForSingleObject(hPrint,INFINITE);
    				printf("Il Pedone vuole tornare! Peso attuale: %d\n",PesoAttuale);
    				ReleaseMutex(hPrint);
    				hNow = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Pedone,(LPVOID) &(R), CREATE_SUSPENDED,NULL);
    				c++;
    				do{ // Inizia il ciclo per il controllo Peso
    					if(PesoAttuale+PESOP<MAXPESO) { // Controllo peso: OK
    						ResumeThread(hNow);
    						break;
    					} else { // Controllo Peso: NOK
    						count++;
    						WaitForSingleObject(hPrint,INFINITE);
    						printf("Peso Massimo raggiunto, Aspetto! Peso Attuale: %d - Ho aspettato %d volte\n", PesoAttuale,count);
    						ReleaseMutex(hPrint);
    						Sleep(10000); // Aspetto un pochito! =)
    						continue;
    					}
    				}while(1); count =0; // Fine del ciclo di controllo Peso
    			}
    			do{ // Inizia il ciclo per il controllo Peso
    				if(PesoAttuale+PESOP<MAXPESO) { // Controllo peso: OK
    					ResumeThread(hNow);
    					break;
    				} else { // Controllo peso: NOK
    					count++;
    					WaitForSingleObject(hPrint,INFINITE);
    					printf("Peso Massimo raggiunto, Aspetto! Ho aspettato %d volte\n", count);
    					ReleaseMutex(hPrint);
    					Sleep(10000); // Aspetto un pochito! =)
    					continue;
    				}
    			}while(1); count =0;  // Fine del ciclo di controllo Peso
    		}
    	} while(getch()!='q');  // Fine del ciclo di creazione Thread!!! :|
    	printf("\n*) Numero Persone sulle corsie: %d\n*) Peso Attuale: %d\nHo creato %d thread!\n\n",Persone[0]+Persone[1],PesoAttuale,c); // Riassuntino finale
    }
    
    void Pedone(LPDWORD lpdparm){
    	DWORD result; // Variabile per il risultato dei Wait.
    	int nCorsia;  // Numero corsia assegnata
    	int dst = *(int *) lpdparm; // Destinazione del viaggio
    	
    	if(dst==0) { // Caso destinazione ANDATA
    		// Assegno un numero di corsia.
    		result = WaitForMultipleObjects(2,hCorsiaR,false,INFINITE);
    		nCorsia = result - WAIT_OBJECT_0 +1;
    		// Caso in cui non vi siano persone sulla stessa corsia
    		if(Persone[nCorsia-1]==0) WaitForSingleObject(hCorsiaA[nCorsia-1],INFINITE); // Occupo la corsia di andata.
    		// Rilascio quella di ritorno. Permetto ad altri di procedere nello stesso senso
    		ReleaseSemaphore(hCorsiaR[nCorsia-1],1,NULL); 
    		WaitForSingleObject(hPeso,INFINITE);
    		PesoAttuale+=PESOP; // Una persona in più --> Aumento Peso
    		ReleaseMutex(hPeso);
    		WaitForSingleObject(hPersone,INFINITE);
    		Persone[nCorsia-1]++; // Una persona in più --> Aumento Persone sulla corsia.
    		ReleaseMutex(hPersone);
    		WaitForSingleObject(hPrint,INFINITE);
    		printf("Il Pedone e' partito (ANDATA). Numero Corsia: %d\n",nCorsia);
    		ReleaseMutex(hPrint);
    		Sleep(5000); // Persona in viaggio di ANDATA
    		WaitForSingleObject(hPrint,INFINITE);
    		printf("Il Pedone e' arrivato(ANDATA). Numero Corsia: %d\n",nCorsia);
    		ReleaseMutex(hPrint);
    		WaitForSingleObject(hPersone,INFINITE);
    		Persone[nCorsia-1]--; // Una persona in meno --> Diminuisco Persone sulla corsia
    		ReleaseMutex(hPersone);
    		WaitForSingleObject(hPeso,INFINITE);
    		PesoAttuale-=PESOP; // Una persona in meno --> Diminuisco Peso
    		ReleaseMutex(hPeso);
    		// Caso in cui non vi siano persone sulla corsia
    		// Rilascio la corsia di andata. Permetto ad altri di tornare.
    		if(Persone[nCorsia-1]==0) ReleaseSemaphore(hCorsiaA[nCorsia-1],1,NULL); 
    		WaitForSingleObject(hPrint,INFINITE);
    		// Riassuntino... =)
    		printf("\n*) Numero Persone sulle corsie: %d\n*) Peso Attuale: %d\n\n",Persone[0]+Persone[1],PesoAttuale); 
    		ReleaseMutex(hPrint);
    	}
    	else { // Caso destinazione RITORNO
    		// Assegno un numero di corsia.
    		result = WaitForMultipleObjects(2,hCorsiaA,false,INFINITE);
    		nCorsia = result - WAIT_OBJECT_0+1;
    		// Caso in cui non vi siano persone sulla stessa corsia
    		if(Persone[nCorsia-1]==0) WaitForSingleObject(hCorsiaR[nCorsia-1],INFINITE);  // Occupo la corsia di ritorno
    		// Rilascio quella di andata. Permetto ad altri di procedere nello stesso senso
    		ReleaseSemaphore(hCorsiaA[nCorsia-1],1,NULL);
    		WaitForSingleObject(hPersone,INFINITE);
    		Persone[nCorsia-1]++; // Una persona in più --> Aumento Peso
    		ReleaseMutex(hPersone);
    		WaitForSingleObject(hPeso,INFINITE);
    		PesoAttuale+=PESOP; // Una persona in più --> Aumento Persone sulla corsia.
    		ReleaseMutex(hPeso);
    		WaitForSingleObject(hPrint,INFINITE);
    		printf("Il Pedone e' partito (RITORNO). Numero Corsia: %d\n",nCorsia);
    		ReleaseMutex(hPrint);
    		Sleep(5000); // Persona in viaggio di RITORNO
    		WaitForSingleObject(hPrint,INFINITE);
    		printf("Il Pedone e' arrivato(RITORNO). Numero Corsia: %d\n",nCorsia);
    		ReleaseMutex(hPrint);
    		WaitForSingleObject(hPersone,INFINITE);
    		Persone[nCorsia-1]--; // Una persona in meno --> Diminuisco Persone sulla corsia
    		ReleaseMutex(hPersone);
    		WaitForSingleObject(hPeso,INFINITE);
    		PesoAttuale-=PESOP; // Una persona in meno --> Diminuisco Peso
    		ReleaseMutex(hPeso);
    		// Caso in cui non vi siano persone sulla corsia
    		// Rilascio la corsia di ritorno. Permetto ad altri di andare.
    		if(Persone[nCorsia-1]==0) ReleaseSemaphore(hCorsiaR[nCorsia-1],1,NULL);
    		WaitForSingleObject(hPrint,INFINITE);
    		// Riassuntino... =)
    		printf("\n*) Numero Persone sulle corsie: %d\n*) Peso Attuale: %d\n\n",Persone[0]+Persone[1],PesoAttuale);
    		ReleaseMutex(hPrint);
    	}
    	
    }
    
    void Carro(LPDWORD lpdparm){
    	DWORD result; // In questo caso è superfluo
    	int dst = *(int *) lpdparm; // Destinazione del viaggio
    	
    	if(dst==0) { // Caso destinazione ANDATA
    		// Occupo entrambe le corsie.
    		result = WaitForMultipleObjects(2,hCorsiaR,true,INFINITE);
    		// Se non ci sono persone su entrambe le corsie, occupo entrambe di andata.
    		if(Persone[0]==0 && Persone[1]==0) WaitForMultipleObjects(2,hCorsiaA,true,INFINITE);
    		// Rilascio entrambe le corsie di ritorno per permettere ad altri di accodarsi.
    		ReleaseSemaphore(hCorsiaR[0],1,NULL);
    		ReleaseSemaphore(hCorsiaR[1],1,NULL);
    		WaitForSingleObject(hPeso,INFINITE);
    		PesoAttuale+=PESOC; // Aggiungo il peso di un Carro
    		ReleaseMutex(hPeso);
    		WaitForSingleObject(hPersone,INFINITE);
    		// Un carro vale due persone!!! Aggiungo due persone
    		Persone[0]++;
    		Persone[1]++;
    		ReleaseMutex(hPersone);
    		WaitForSingleObject(hPrint,INFINITE);
    		printf("Il Carro e' partito (ANDATA).\n");
    		ReleaseMutex(hPrint);
    		Sleep(5000); // Carro in viaggio di ANDATA
    		WaitForSingleObject(hPrint,INFINITE);
    		printf("Il Carro e' arrivato(ANDATA).\n");
    		ReleaseMutex(hPrint);
    		WaitForSingleObject(hPersone,INFINITE);
    		// Un carro vale due persone!!! Tolgo due persone
    		Persone[0]--;
    		Persone[1]--;
    		ReleaseMutex(hPersone);
    		WaitForSingleObject(hPeso,INFINITE);
    		PesoAttuale-=PESOC; // Tolgo il Peso di un Carro
    		ReleaseMutex(hPeso);
    		// Caso in cui non ci son persone in entrambe le corsie
    		if(Persone[0]==0 && Persone[1]==0) {
    			// Rilascio entrambe le corsie di andata, per permettere ad altri di tornare.
    			ReleaseSemaphore(hCorsiaA[0],1,NULL);
    			ReleaseSemaphore(hCorsiaA[1],1,NULL);
    		}
    		WaitForSingleObject(hPrint,INFINITE);
    		// Riassuntino... =)
    		printf("\n*) Numero Persone sulle corsie: %d\n*) Peso Attuale: %d\n\n",Persone[0]+Persone[1],PesoAttuale);
    		ReleaseMutex(hPrint);
    	}
    	else { // Caso destinazione RITORNO
    		// Occupo entrambe le corsie.
    		result = WaitForMultipleObjects(2,hCorsiaA,true,INFINITE);
    		// Se non ci sono persone su entrambe le corsie, occupo entrambe di ritorno.
    		if(Persone[0]==0 && Persone[1]==0) WaitForMultipleObjects(2,hCorsiaR,true,INFINITE);
    		// Rilascio entramebe le corsie di andata per permettere ad altri di accodarsi.
    		ReleaseSemaphore(hCorsiaA[0],1,NULL);
    		ReleaseSemaphore(hCorsiaA[1],1,NULL);
    		WaitForSingleObject(hPeso,INFINITE);
    		PesoAttuale+=PESOC; // Aggiungo il peso di un Carro
    		ReleaseMutex(hPeso);
    		WaitForSingleObject(hPersone,INFINITE);
    		// Un carro vale due persone!!! Aggiungo due persone
    		Persone[0]++;
    		Persone[1]++;
    		ReleaseMutex(hPersone);
    		WaitForSingleObject(hPrint,INFINITE);
    		printf("Il Carro e' partito (RITORNO).\n");
    		ReleaseMutex(hPrint);
    		Sleep(5000); // Carro in viaggio di RITORNO
    		WaitForSingleObject(hPrint,INFINITE);
    		printf("Il Carro e' arrivato(RITORNO).\n");
    		ReleaseMutex(hPrint);