INFOPedia : LSOMutexAutoloavaggio

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

Autolavaggio


In un lavaggio auto molto frequentato vi sono tre postazioni per il lavaggio automatico. Il tempo di lavaggio per le tre posatazioni è diverso l’uno dall’altro precisamente di t, 2t, ciascuno e solo il primo può essere utilizzato da vetture di grossa dimenzione come camion, monovolume ect.
La vita delle vetture è la seguente.
1) Si assegni in maniera random la tipologia delle vetture.
2) Esse in funzione della propria tipologia (1 normali, 2 grandi) aspettano che una delle tre o che la prima postazione si liberi
3) Si lavano per un tempo dipendente dalla posatazoione
5) Escono dalla postazione

a) Sviluppare in linguaggio C un programma che simuli la situazione descritta commentando le scelte fatte.
b) Descrivere una possibile situazione gestita da un Sistema Operativo che si avvicini alla situazione descritta.

//----------------------------------------------------------------------------------------------------------------
// Importo le librerie necessarie...
//----------------------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <process.h>
#include <conio.h>
#include <time.h>



//----------------------------------------------------------------------------------------------------------------
// Definisco le variabili globali e le costanti...
//----------------------------------------------------------------------------------------------------------------
#define __Lavaggi 3
#define t 2000
HANDLE H_Mutex_Lavaggi[__Lavaggi];



//----------------------------------------------------------------------------------------------------------------
// Definisco le procedure e le funzioni del listato...
//----------------------------------------------------------------------------------------------------------------
#define randomize srand((unsigned)time(NULL))
#define GetRandom(min,max) (rand()%((int)(max)-(min)+1)+(min))
HANDLE finito(LPDWORD lpdwParam);
void car(int *count);


//----------------------------------------------------------------------------------------------------------------
// Procedura MAIN...
//----------------------------------------------------------------------------------------------------------------
void main()
{
    int fine = 0;
    int count = 0;

    //Creo un mutex per ogni lavaggio
    for(int i=0;i<__Lavaggi;i++)
        H_Mutex_Lavaggi[i] = CreateMutex(NULL,false,NULL);

    //Creo il thread per gestire la fine del programma,e ne controllo la validità
    if (CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) finito,(LPVOID) &fine,0,NULL) == NULL)
        printf("ERRORE CREAZIONE THREAD!!!");
    else
    {
        while (fine == 0)
        {
            Sleep(GetRandom(1,3000));
            count++;
            CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) car,(LPVOID) &count,0,NULL);
        }
    }
}



//----------------------------------------------------------------------------------------------------------------
// Procedura che determina la fine del programma...
//----------------------------------------------------------------------------------------------------------------
HANDLE finito(LPDWORD lpdwParam)
{
    int *fine;
    fine=(int*)lpdwParam;
    getch();
    *fine=1;

    return 0;
}



//----------------------------------------------------------------------------------------------------------------
// Procedura che gestisce le macchine...
//----------------------------------------------------------------------------------------------------------------
void car(int *count)
{
    int car_type,car_num;
    DWORD out,free_place;

    randomize;
    car_type = GetRandom(1,2);
    car_num = *count;
    if (car_type == 1)
    {
        printf("-----> E'' in arrivo la Macchina grande num%i <-----\n",car_num);
        printf(" La macchina grande num%i controlla se il Lavaggio1 e'' libero,altrimenti attende...\n",car_num);
        WaitForSingleObject(H_Mutex_Lavaggi[0],INFINITE);
            printf("La macchina grande num%i occupa il Lavaggio1 e comincia lo sgrasciamento...\n",car_num);
            Sleep(t);
            printf("La macchina grande num%i ha finito lo sgrasciamento,libera il Lavaggio1...\n",car_num);
            printf("***** Il lavaggio1 e'' ora Libero!! *****\n");
        ReleaseMutex(H_Mutex_Lavaggi[0]);
    }
    else
    {
        printf("-----> E'' in arrivo la Macchina piccola num%i <-----\n",car_num);
        printf(" La macchina piccola num%i controlla se c'e'' un lavaggio libero,altrimenti attende...\n",car_num);
        out = WaitForMultipleObjects(__Lavaggi,H_Mutex_Lavaggi,false,INFINITE);
            free_place = out-WAIT_OBJECT_0+1;
            printf("La macchina piccola num%i occupa il Lavaggio%i e comincia lo sgrasciamento...\n",car_num,free_place);
            Sleep(free_place * t);
            printf("La macchina piccola num%i ha finito lo sgrasciamento,libera il Lavaggio%i...\n",car_num,free_place);
            printf("***** Il lavaggio%i e'' ora Libero!! *****\n",free_place);
        ReleaseMutex(H_Mutex_Lavaggi[free_place-1]);
    }
}


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.5045 secondi