INFOPedia : LSOTreni2

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

Treni 2


//-----------------------------------------------
//IMPORTO LE LIBRERIE
//-----------------------------------------------

#include <stdio.h>
#include <windows.h>
#include <conio.h>


//-----------------------------------------------
//COSTANTI E FUNZIONI
//-----------------------------------------------

#define T 1000
#define TA1 0
#define TA2 10000

void T1();
void T2();
void T3();

//-----------------------------------------------
//VARIABILI
//-----------------------------------------------

CRITICAL_SECTION cs;
int Andata[2],Ritorno[2];


//-----------------------------------------------
//MAIN
//-----------------------------------------------

void main(){
    int i;
    InitializeCriticalSection(&cs);
    for(i=0;i<2;i++){
        Andata[i] = 0;
        Ritorno[i] = 0;
    }

    CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)T1,NULL,0,NULL);
    CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)T2,NULL,0,NULL);
    CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)T3,NULL,0,NULL);

    getch();
}

//-----------------------------------------------
//Treno 1
//-----------------------------------------------
void T1(){
    int status=0,pos=0; /* 0 fermo 1 movimento */  /* 0 A, 1 C */

    while(1){
        if (pos == 0){ //ANDATA
            EnterCriticalSection(&cs);
                if ((Ritorno[0] == 0) && (Ritorno[1] == 0)){
                    Andata[0]++;
                    Andata[1]++;
                    status=1;
                }
            LeaveCriticalSection(&cs);

            if (status == 1 ){ //treno si muove
                printf("Treno 1 parte per C\n");
                Sleep(T*2);
                pos=1;
                status=0;
                EnterCriticalSection(&cs);
                    Andata[0]--;
                    Andata[1]--;
                LeaveCriticalSection(&cs);
                printf("Treno 1 arriva a C\n");
                Sleep(TA1);
            }else Sleep(500);
        }
        else {  //RITORNO
            EnterCriticalSection(&cs);
                if ((Andata[0] == 0) && (Andata[1] == 0)){
                    Ritorno[0]++;
                    Ritorno[1]++;
                    status=1;
                }
            LeaveCriticalSection(&cs);
           
            if (status == 1 ){ //treno si muove
                printf("Treno 1 parte per A\n");
                Sleep(T*2);
                pos=0;
                status = 0;
                EnterCriticalSection(&cs);
                    Ritorno[0]--;
                    Ritorno[1]--;
                LeaveCriticalSection(&cs);
                printf("Treno 1 arriva a A\n");
                Sleep(TA1);
            }else Sleep(500);

        }

    }
}

void T2(){
    int status=0,pos=0; /* 0 fermo 1 movimento */  /* 0 A, 1 C */
   
    while(1){
        if (pos == 0){ //ANDATA
            EnterCriticalSection(&cs);
                if (Ritorno[0] == 0) {
                    Andata[0]++;
                    status=1;

                }
            LeaveCriticalSection(&cs);
           
            if (status == 1 ){ //treno si muove
                printf("Treno 2 parte per B\n");
                Sleep(T);
                pos=1;
                status=0;
                EnterCriticalSection(&cs);
                    Andata[0]--;
                LeaveCriticalSection(&cs);
                printf("Treno 2 arriva a B\n");
                Sleep(TA2);
            }else Sleep(500);
        }
        else {  //RITORNO
            EnterCriticalSection(&cs);
                if (Andata[0] == 0){
                    Ritorno[0]++;
                    status=1;
                }
            LeaveCriticalSection(&cs);
           
            if (status == 1 ){ //treno si muove
                printf("Treno 2 parte per A\n");
                Sleep(T);
                pos=0;
                status = 0;
                EnterCriticalSection(&cs);
                    Ritorno[0]--;
                LeaveCriticalSection(&cs);
                printf("Treno 2 arriva a A\n");
                Sleep(TA2);
            }else Sleep(500);
           
        }
       
    }
}
void T3(){

    int status=0,pos=0; /* 0 fermo 1 movimento */  /* 0 A, 1 C */
   
    while(1){
        if (pos == 0){ //ANDATA
            EnterCriticalSection(&cs);
                if (Ritorno[1] == 0) {
                    Andata[1]++;
                    status=1;
                }
            LeaveCriticalSection(&cs);
           
            if (status == 1 ){ //treno si muove
                printf("Treno 3 parte per C\n");
                Sleep(T);
                pos=1;
                status=0;
                EnterCriticalSection(&cs);
                    Andata[1]--;
                LeaveCriticalSection(&cs);
                printf("Treno 3 arriva a C\n");
                Sleep(TA2);
            }else Sleep(500);
        }
        else {  //RITORNO
            EnterCriticalSection(&cs);
                if (Andata[1] == 0){
                    Ritorno[1]++;
                    status=1;
                }
            LeaveCriticalSection(&cs);
           
            if (status == 1 ){ //treno si muove
                printf("Treno 3 parte per B\n");
                Sleep(T);
                pos=0;
                status = 0;
                EnterCriticalSection(&cs);
                    Ritorno[1]--;
                LeaveCriticalSection(&cs);
                printf("Treno 3 arriva a B\n");
                Sleep(TA2);
            }else Sleep(500);
           
        }
       
    }
}


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