INFOPedia : LSOPonteTibetano2

HomePage :: Categorie :: Indice :: Ultime modifiche :: Ultimi commenti :: Login/Registrazione

Ponte Tibetano 2


Questa implementazione non tiene fatto come nella precedente di quale corsia sia occupata al momento da un passeggero, e risulta quindi pių semplice da implementare

Sono state utilizzati 2 array globali che tenevano il conto delle persone e dei carri sia in andata sia in ritorno, ed un mutex che regola la lettura scrittura di queste variabili


//---------------------------------------------

//IMPORTO LE LIBRERIE

//---------------------------------------------

#include <stdio.h>

#include <windows.h>

#include <conio.h>

#include <time.h>



//---------------------------------------------

//DEFINISCO LE COSTANTI E FUNZIONI

//---------------------------------------------



#define MAXLOAD 5000

#define randomize(x) srand((unsigned)time(NULL)*(x))
/*
 *La funzione randomize è stata corretta in modo che il sema dipenda anche da un altro valore, in modo da ottenere
 *semi diversi con maggiore probabilità
 */


#define GetRandom(min, max) ((rand() % (int)(((max) +1) - (min))) + (min))

#define T1 3000                                            //tempo percorrenza carro

#define T2 6000                                            //tempo percorrenza persone

#define N_Carri 5

#define N_Persone 8



void carro();

void persona();



//---------------------------------------------

//DICHIARO LE VARIABILI

//---------------------------------------------



HANDLE H_mutex;

int P_carri[2]={0,0};                                //numero carri verso A e B

int P_persone[2]={0,0};                            //numero persone verso A e B

int peso_ponte=0;

int countP=0,countC=0;





//---------------------------------------------

//MAIN

//---------------------------------------------



void main(){

    int i;

    H_mutex = CreateMutex(NULL,false,NULL);



    for(i=0;i<N_Persone;i++) 

        CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)persona,NULL,0,NULL);

    for(i=0;i<N_Carri;i++)

        CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)carro,NULL,0,NULL);



    getch();

}





//---------------------------------------------

//THREAD

//---------------------------------------------

void carro(){

    int peso, source,id=countC++,tempo;        //id è ottenuto assegnando ed incrementando la variabile globale countC

    randomize(id);            

    peso = GetRandom(1500,3000);   //peso casuale

    source = GetRandom(0,1);       //città sorgente casuale

    while(1){

       

        WaitForSingleObject(H_mutex,INFINITE); //Mutex per l'accesso alle variabili globali

        if ((peso + peso_ponte <= MAXLOAD) && (P_carri[1 - source] == 0) && (P_persone[1-source] == 0)){    //controllo di tutte le condizioni necessarie per partire

            peso_ponte += peso;

            P_carri[source]++;

            printf("Carro **%d** PESO %d attraversa il ponte da %d verso %d, peso restante %d\n",id,peso,source,1-source,MAXLOAD-peso_ponte);

            ReleaseMutex(H_mutex);

            tempo = (P_persone[source] == 0) ? T1 : T2;   //Se ci sono persone allora cammino alla loro velocità, altrimenti posso andare + veloce

            Sleep(tempo);

            WaitForSingleObject(H_mutex,INFINITE);

            peso_ponte-=peso;

            P_carri[source]--;

            printf("Carri **%d** PESO %d arriva da %d a %d peso restante %d\n",id,peso,source,1-source,MAXLOAD-peso_ponte);

            source = 1-source;                    //aggiorno la variabile della città

            ReleaseMutex(H_mutex);

            Sleep(1000);                        //pensa 10 secondi sul significato della vita

           

        }else {

            ReleaseMutex(H_mutex);

            Sleep(1000);

        }

    }

       

}



void persona(){



    int peso, source,id=countP++;

    randomize(id);

    peso = GetRandom(60,100);

    source = GetRandom(0,1);

    while(1){

       

        WaitForSingleObject(H_mutex,INFINITE);

        if ((peso + peso_ponte <= MAXLOAD) && (P_carri[1 - source] == 0)){  //come sopra, ma non mi interessa controllare se ci sono persone nell'altro verso

            peso_ponte += peso;

            P_persone[source]++;

            printf("Persona **%d** PESO %d attraversa il ponte da %d verso %d, peso restante %d\n",id,peso,source,1-source,MAXLOAD-peso_ponte);

            ReleaseMutex(H_mutex);

            Sleep(T2);

            WaitForSingleObject(H_mutex,INFINITE);

            peso_ponte-=peso;

            P_persone[source]--;

            printf("Persona **%d** PESO %d arriva da %d a %d peso restante %d\n",id,peso,source,1-source,MAXLOAD-peso_ponte);

            source = 1-source;

            ReleaseMutex(H_mutex);

            Sleep(10000);                        //pensa 10 secondi sul significato della vita

           

        }else {

            ReleaseMutex(H_mutex);

            Sleep(1000);

        }

    }

   

}




Torna a Lab Sistemi Operativi

Non ci sono commenti in questa pagina. [Scrivi commento]

Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by Wikka Wakka Wiki 1.1.6.1
La pagina č stata generata in 0.2112 secondi