La versione più recente è stata modificata il 2006-06-08 16:52:34 da DenteDiLupo [Spostato vecchio codice]
Omissioni:
//----------------------------------------------------------------------------------------------------------------
// Importo le librerie necessarie...
//----------------------------------------------------------------------------------------------------------------
#include <windows.h>
#include <time.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
//----------------------------------------------------------------------------------------------------------------
// Dichiaro le costanti e le variabili globali...
//----------------------------------------------------------------------------------------------------------------
#define __Wait_Object_Time 1000 //Definisco un tempo di attesa limitato (100 secondi)
#define __Timerun 2500 //Definisco una costante per il tempo di percorrenza di ogni tragitto
#define __T1_Timewait 5000 //Definisco una costante per il tempo di attesa del treno T1
#define __T2_Timewait 2000 //Definisco una costante per il tempo di attesa del treno T2
#define __T3_Timewait 3000 //Definisco una costante per il tempo di attesa del treno T3
#define __Multi_Train 2 //Definisco il numero di treni che possono viaggiare sullo stesso binario,solo se vanno nella stessa direzione
#define __tragitti_andata 2 //Definisco una costante per il numeri di tragitti all'andata
#define __tragitti_ritorno 2 //Definisco una costante per il numeri di tragitti al ritorno
HANDLE H_Semaphore_Tragitto_Andata[__tragitti_andata]; //l'array di semafori dei tragitti dell'andata
HANDLE H_Semaphore_Tragitto_Ritorno[__tragitti_ritorno]; //l'array di semafori dei tragitti del ritorno
//----------------------------------------------------------------------------------------------------------------
// Dichiaro le funzioni e le procedure...
//----------------------------------------------------------------------------------------------------------------
#define GetRandom( min, max ) ((rand() % (int)(((max) + 1) - (min))) + (min))
#define randomize srand((unsigned)time(NULL))
void T1(int *fine);
void T2(int *fine);
void T3(int *fine);
HANDLE Finito(LPDWORD lpdwParam);
//----------------------------------------------------------------------------------------------------------------
// Main...
//----------------------------------------------------------------------------------------------------------------
void main()
{
int i,fine=0;
//Creo il thread per gestire la fine...
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Finito,(LPVOID) &fine,0,NULL);
//Creo un semaforo per ogni tragitto dell'andata...
for(i=0;i<__tragitti_andata;i++)
H_Semaphore_Tragitto_Andata[i] = CreateSemaphore(NULL, __Multi_Train,__Multi_Train,NULL);
//Creo un semaforo per ogni tragitto del ritorno...
for(i=0;i<__tragitti_ritorno;i++)
H_Semaphore_Tragitto_Ritorno[i] = CreateSemaphore(NULL, __Multi_Train,__Multi_Train,NULL);
//Creo i 3 thread,uno per ogni treno...
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) T1 ,(LPVOID) &fine ,0, NULL);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) T2 ,(LPVOID) &fine ,0, NULL);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) T3 ,(LPVOID) &fine ,0, NULL);
//Inizio attesa attiva
while (fine == 0);
}
//----------------------------------------------------------------------------------------------------------------
// Funzione che gestisce il treno T1...
//----------------------------------------------------------------------------------------------------------------
void T1(int *fine)
{
int pos=0;
while (*fine == 0)
{
if ( (pos == 0) && ( WaitForMultipleObjects(__tragitti_ritorno,H_Semaphore_Tragitto_Ritorno,true,(__Wait_Object_Time * __T1_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T1 *** si assicura che nessun treno gli vada contro...\n");
if ( (pos == 0) && ( WaitForMultipleObjects(__tragitti_ritorno,H_Semaphore_Tragitto_Ritorno,true,(__Wait_Object_Time * __T1_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T1 *** controllo superato,attende il permesso per partire...\n");
if ( WaitForMultipleObjects(__tragitti_andata,H_Semaphore_Tragitto_Andata,true,(__Wait_Object_Time * __T1_Timewait) ) != WAIT_TIMEOUT )
{
pos = 1;
printf("*** T1 *** e' partito dalla stazione A\n");
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[0],2,NULL);
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[1],2,NULL);
Sleep(__Timerun );
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[0],1,NULL);
printf("*** T1 *** e' appena passato dalla stazione B\n");
Sleep(__Timerun );
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[1],1,NULL);
printf("*** T1 *** e' arrivato alla stazione C\n");
}
}
else
{
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[0],1,NULL);
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[1],1,NULL);
}
}
printf("*** T1 *** fa una sosta alla stazione C\n");
Sleep(__T1_Timewait);
if ( (pos == 1) && ( WaitForMultipleObjects(__tragitti_andata,H_Semaphore_Tragitto_Andata,true,(__Wait_Object_Time * __T1_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T1 *** si assicura che nessun treno gli vada contro...\n");
if ( (pos == 1) && ( WaitForMultipleObjects(__tragitti_andata,H_Semaphore_Tragitto_Andata,true,(__Wait_Object_Time * __T1_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T1 *** controllo superato,attende il permesso per partire...\n");
if ( WaitForMultipleObjects(__tragitti_ritorno,H_Semaphore_Tragitto_Ritorno,true,(__Wait_Object_Time * __T1_Timewait) ) != WAIT_TIMEOUT )
{
pos = 0;
printf("*** T1 *** e' partito dalla stazione C\n");
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[0],2,NULL);
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[1],2,NULL);
Sleep(__Timerun );
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[1],1,NULL);
printf("*** T1 *** e' appena passato dalla stazione B\n");
Sleep(__Timerun );
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[0],1,NULL);
printf("*** T1 *** e' arrivato alla stazione A\n");
}
}
else
{
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[0],1,NULL);
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[1],1,NULL);
}
}
printf("*** T1 *** fa una sosta alla stazione A\n");
Sleep(__T1_Timewait);
}
}
//----------------------------------------------------------------------------------------------------------------
// Funzione che gestisce il treno T2...
//----------------------------------------------------------------------------------------------------------------
void T2(int *fine)
{
int pos=0;
while (*fine == 0)
{
if ( (pos == 0) && ( WaitForSingleObject(H_Semaphore_Tragitto_Ritorno[0],(__Wait_Object_Time * __T2_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T2 *** si assicura che nessun treno gli vada contro...\n");
if ( (pos == 0) && ( WaitForSingleObject(H_Semaphore_Tragitto_Ritorno[0],(__Wait_Object_Time * __T2_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T2 *** controllo superato,attende il permesso per partire...\n");
if ( WaitForSingleObject(H_Semaphore_Tragitto_Andata[0],(__Wait_Object_Time * __T2_Timewait) ) != WAIT_TIMEOUT )
{
pos = 1;
printf("*** T2 *** e' partito dalla stazione A\n");
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[0],2,NULL);
Sleep(__Timerun );
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[0],1,NULL);
printf("*** T2 *** e' arrivato alla stazione B\n");
}
}
else
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[0],1,NULL);
}
printf("*** T2 *** fa una sosta alla stazione B\n");
Sleep(__T2_Timewait);
if ( (pos == 1) && ( WaitForSingleObject(H_Semaphore_Tragitto_Andata[0],(__Wait_Object_Time * __T2_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T2 *** si assicura che nessun treno gli vada contro...\n");
if ( (pos == 1) && ( WaitForSingleObject(H_Semaphore_Tragitto_Andata[0],(__Wait_Object_Time * __T2_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T2 *** controllo superato,attende il permesso per partire...\n");
if ( WaitForSingleObject(H_Semaphore_Tragitto_Ritorno[0],(__Wait_Object_Time * __T2_Timewait) ) != WAIT_TIMEOUT )
{
pos = 0;
printf("*** T2 *** e' partito dalla stazione B\n");
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[0],2,NULL);
Sleep(__Timerun );
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[0],1,NULL);
printf("*** T2 *** e' arrivato alla stazione A\n");
}
}
else
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[0],1,NULL);
}
printf("*** T2 *** fa una sosta alla stazione A\n");
Sleep(__T2_Timewait);
}
}
//----------------------------------------------------------------------------------------------------------------
// Funzione che gestisce il treno T3...
//----------------------------------------------------------------------------------------------------------------
void T3(int *fine)
{
int pos=0;
while (*fine == 0)
{
if ( (pos == 0) && ( WaitForSingleObject(H_Semaphore_Tragitto_Ritorno[1],(__Wait_Object_Time * __T3_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T3 *** si assicura che nessun treno gli vada contro...\n");
if ( (pos == 0) && ( WaitForSingleObject(H_Semaphore_Tragitto_Ritorno[1],(__Wait_Object_Time * __T3_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T3 *** controllo superato,attende il permesso per partire...\n");
if ( WaitForSingleObject(H_Semaphore_Tragitto_Andata[1],(__Wait_Object_Time * __T3_Timewait) ) != WAIT_TIMEOUT )
{
pos = 1;
printf("*** T3 *** e' partito dalla stazione B\n");
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[1],2,NULL);
Sleep(__Timerun );
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[1],1,NULL);
printf("*** T3 *** e' arrivato alla stazione C\n");
}
}
else
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[1],1,NULL);
}
printf("*** T3 *** fa una sosta alla stazione C\n");
Sleep(__T3_Timewait);
if ( (pos == 1) && ( WaitForSingleObject(H_Semaphore_Tragitto_Andata[1],(__Wait_Object_Time * __T3_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T3 *** si assicura che nessun treno gli vada contro...\n");
if ( (pos == 1) && ( WaitForSingleObject(H_Semaphore_Tragitto_Andata[1],(__Wait_Object_Time * __T3_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T3 *** controllo superato,attende il permesso per partire...\n");
if ( WaitForSingleObject(H_Semaphore_Tragitto_Ritorno[1],(__Wait_Object_Time * __T3_Timewait) ) != WAIT_TIMEOUT )
{
pos = 0;
printf("*** T3 *** e' partito dalla stazione C\n");
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[1],2,NULL);
Sleep(__Timerun );
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[1],1,NULL);
printf("*** T3 *** e' arrivato alla stazione B\n");
}
}
else
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[1],1,NULL);
}
printf("*** T3 *** fa una sosta alla stazione B\n");
Sleep(__T3_Timewait);
}
}
//----------------------------------------------------------------------------------------------------------------
// Procedura che determina la fine del programma...
//----------------------------------------------------------------------------------------------------------------
HANDLE Finito(LPDWORD lpdwParam)
{
int *fine;
fine=(int*)lpdwParam;
getch();
*fine=1;
return 0;
}
Modificato il 2006-06-08 16:46:11 da DenteDiLupo [aggiunti link alle singole implementazioni]
Aggiunzioni:
Possibile Implementazione 1
Possibile Implementazione 2
Modificato il 2006-05-30 20:37:34 da ChiptuttoFuso
Aggiunzioni:
Tre treni T1 e T2 T3 collegano tre stazioni A B e C su una tratta a singolo binario.
Omissioni:
Tre treni T1 e T2 T3 collegano tre stazioni A B e C su una tratta a singolo binario (vedi figura)
Modificato il 2006-05-30 20:36:50 da ChiptuttoFuso
Aggiunzioni:
Tre treni T1 e T2 T3 collegano tre stazioni A B e C su una tratta a singolo binario (vedi figura)
T1 fa la spola tra A e C,T2 fa la spola tra A e B , e T3 tra B e C. I Treni possono viaggiare contemporaneamente sulla stessa linea solo se stanno andando nella stessa direzione. T1 ha priorità rispetto al treno T2 e T3 ossia se T1 non dovra mai fermarsi alla stazione B per aspettare T1 o T2.
I treni partono dopo avere atteso alla stazione un dato tempo (TIMET1 e TIMET2 e TIMET3) e percorrono le tratte alla stessa velocità , quindi T1 impiegna 2*k minuti, T2 e T3 k minuti.
1. Scrivere il programma Treni in C che abbia le i seguenti processi:
T1 ();
T2();
T3()
Il programma deve soddisfare alle seguenti caratteristiche:
a) assenza di deadlock
b) assenza di scontri.
2. Spiegare come le proprietà a e b sono rispettate dal vostro algoritmo.
Modificato il 2006-05-30 20:34:02 da ChiptuttoFuso
Aggiunzioni:
I 3 TRENI
//----------------------------------------------------------------------------------------------------------------
// Importo le librerie necessarie...
//----------------------------------------------------------------------------------------------------------------
#include <windows.h>
#include <time.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
//----------------------------------------------------------------------------------------------------------------
// Dichiaro le costanti e le variabili globali...
//----------------------------------------------------------------------------------------------------------------
#define __Wait_Object_Time 1000 //Definisco un tempo di attesa limitato (100 secondi)
#define __Timerun 2500 //Definisco una costante per il tempo di percorrenza di ogni tragitto
#define __T1_Timewait 5000 //Definisco una costante per il tempo di attesa del treno T1
#define __T2_Timewait 2000 //Definisco una costante per il tempo di attesa del treno T2
#define __T3_Timewait 3000 //Definisco una costante per il tempo di attesa del treno T3
#define __Multi_Train 2 //Definisco il numero di treni che possono viaggiare sullo stesso binario,solo se vanno nella stessa direzione
#define __tragitti_andata 2 //Definisco una costante per il numeri di tragitti all'andata
#define __tragitti_ritorno 2 //Definisco una costante per il numeri di tragitti al ritorno
HANDLE H_Semaphore_Tragitto_Andata[__tragitti_andata]; //l'array di semafori dei tragitti dell'andata
HANDLE H_Semaphore_Tragitto_Ritorno[__tragitti_ritorno]; //l'array di semafori dei tragitti del ritorno
//----------------------------------------------------------------------------------------------------------------
// Dichiaro le funzioni e le procedure...
//----------------------------------------------------------------------------------------------------------------
#define GetRandom( min, max ) ((rand() % (int)(((max) + 1) - (min))) + (min))
#define randomize srand((unsigned)time(NULL))
void T1(int *fine);
void T2(int *fine);
void T3(int *fine);
HANDLE Finito(LPDWORD lpdwParam);
//----------------------------------------------------------------------------------------------------------------
// Main...
//----------------------------------------------------------------------------------------------------------------
void main()
{
int i,fine=0;
//Creo il thread per gestire la fine...
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Finito,(LPVOID) &fine,0,NULL);
//Creo un semaforo per ogni tragitto dell'andata...
for(i=0;i<__tragitti_andata;i++)
H_Semaphore_Tragitto_Andata[i] = CreateSemaphore(NULL, __Multi_Train,__Multi_Train,NULL);
//Creo un semaforo per ogni tragitto del ritorno...
for(i=0;i<__tragitti_ritorno;i++)
H_Semaphore_Tragitto_Ritorno[i] = CreateSemaphore(NULL, __Multi_Train,__Multi_Train,NULL);
//Creo i 3 thread,uno per ogni treno...
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) T1 ,(LPVOID) &fine ,0, NULL);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) T2 ,(LPVOID) &fine ,0, NULL);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) T3 ,(LPVOID) &fine ,0, NULL);
//Inizio attesa attiva
while (fine == 0);
}
//----------------------------------------------------------------------------------------------------------------
// Funzione che gestisce il treno T1...
//----------------------------------------------------------------------------------------------------------------
void T1(int *fine)
{
int pos=0;
while (*fine == 0)
{
if ( (pos == 0) && ( WaitForMultipleObjects(__tragitti_ritorno,H_Semaphore_Tragitto_Ritorno,true,(__Wait_Object_Time * __T1_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T1 *** si assicura che nessun treno gli vada contro...\n");
if ( (pos == 0) && ( WaitForMultipleObjects(__tragitti_ritorno,H_Semaphore_Tragitto_Ritorno,true,(__Wait_Object_Time * __T1_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T1 *** controllo superato,attende il permesso per partire...\n");
if ( WaitForMultipleObjects(__tragitti_andata,H_Semaphore_Tragitto_Andata,true,(__Wait_Object_Time * __T1_Timewait) ) != WAIT_TIMEOUT )
{
pos = 1;
printf("*** T1 *** e' partito dalla stazione A\n");
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[0],2,NULL);
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[1],2,NULL);
Sleep(__Timerun );
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[0],1,NULL);
printf("*** T1 *** e' appena passato dalla stazione B\n");
Sleep(__Timerun );
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[1],1,NULL);
printf("*** T1 *** e' arrivato alla stazione C\n");
}
}
else
{
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[0],1,NULL);
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[1],1,NULL);
}
}
printf("*** T1 *** fa una sosta alla stazione C\n");
Sleep(__T1_Timewait);
if ( (pos == 1) && ( WaitForMultipleObjects(__tragitti_andata,H_Semaphore_Tragitto_Andata,true,(__Wait_Object_Time * __T1_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T1 *** si assicura che nessun treno gli vada contro...\n");
if ( (pos == 1) && ( WaitForMultipleObjects(__tragitti_andata,H_Semaphore_Tragitto_Andata,true,(__Wait_Object_Time * __T1_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T1 *** controllo superato,attende il permesso per partire...\n");
if ( WaitForMultipleObjects(__tragitti_ritorno,H_Semaphore_Tragitto_Ritorno,true,(__Wait_Object_Time * __T1_Timewait) ) != WAIT_TIMEOUT )
{
pos = 0;
printf("*** T1 *** e' partito dalla stazione C\n");
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[0],2,NULL);
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[1],2,NULL);
Sleep(__Timerun );
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[1],1,NULL);
printf("*** T1 *** e' appena passato dalla stazione B\n");
Sleep(__Timerun );
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[0],1,NULL);
printf("*** T1 *** e' arrivato alla stazione A\n");
}
}
else
{
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[0],1,NULL);
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[1],1,NULL);
}
}
printf("*** T1 *** fa una sosta alla stazione A\n");
Sleep(__T1_Timewait);
}
}
//----------------------------------------------------------------------------------------------------------------
// Funzione che gestisce il treno T2...
//----------------------------------------------------------------------------------------------------------------
void T2(int *fine)
{
int pos=0;
while (*fine == 0)
{
if ( (pos == 0) && ( WaitForSingleObject(H_Semaphore_Tragitto_Ritorno[0],(__Wait_Object_Time * __T2_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T2 *** si assicura che nessun treno gli vada contro...\n");
if ( (pos == 0) && ( WaitForSingleObject(H_Semaphore_Tragitto_Ritorno[0],(__Wait_Object_Time * __T2_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T2 *** controllo superato,attende il permesso per partire...\n");
if ( WaitForSingleObject(H_Semaphore_Tragitto_Andata[0],(__Wait_Object_Time * __T2_Timewait) ) != WAIT_TIMEOUT )
{
pos = 1;
printf("*** T2 *** e' partito dalla stazione A\n");
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[0],2,NULL);
Sleep(__Timerun );
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[0],1,NULL);
printf("*** T2 *** e' arrivato alla stazione B\n");
}
}
else
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[0],1,NULL);
}
printf("*** T2 *** fa una sosta alla stazione B\n");
Sleep(__T2_Timewait);
if ( (pos == 1) && ( WaitForSingleObject(H_Semaphore_Tragitto_Andata[0],(__Wait_Object_Time * __T2_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T2 *** si assicura che nessun treno gli vada contro...\n");
if ( (pos == 1) && ( WaitForSingleObject(H_Semaphore_Tragitto_Andata[0],(__Wait_Object_Time * __T2_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T2 *** controllo superato,attende il permesso per partire...\n");
if ( WaitForSingleObject(H_Semaphore_Tragitto_Ritorno[0],(__Wait_Object_Time * __T2_Timewait) ) != WAIT_TIMEOUT )
{
pos = 0;
printf("*** T2 *** e' partito dalla stazione B\n");
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[0],2,NULL);
Sleep(__Timerun );
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[0],1,NULL);
printf("*** T2 *** e' arrivato alla stazione A\n");
}
}
else
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[0],1,NULL);
}
printf("*** T2 *** fa una sosta alla stazione A\n");
Sleep(__T2_Timewait);
}
}
//----------------------------------------------------------------------------------------------------------------
// Funzione che gestisce il treno T3...
//----------------------------------------------------------------------------------------------------------------
void T3(int *fine)
{
int pos=0;
while (*fine == 0)
{
if ( (pos == 0) && ( WaitForSingleObject(H_Semaphore_Tragitto_Ritorno[1],(__Wait_Object_Time * __T3_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T3 *** si assicura che nessun treno gli vada contro...\n");
if ( (pos == 0) && ( WaitForSingleObject(H_Semaphore_Tragitto_Ritorno[1],(__Wait_Object_Time * __T3_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T3 *** controllo superato,attende il permesso per partire...\n");
if ( WaitForSingleObject(H_Semaphore_Tragitto_Andata[1],(__Wait_Object_Time * __T3_Timewait) ) != WAIT_TIMEOUT )
{
pos = 1;
printf("*** T3 *** e' partito dalla stazione B\n");
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[1],2,NULL);
Sleep(__Timerun );
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[1],1,NULL);
printf("*** T3 *** e' arrivato alla stazione C\n");
}
}
else
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[1],1,NULL);
}
printf("*** T3 *** fa una sosta alla stazione C\n");
Sleep(__T3_Timewait);
if ( (pos == 1) && ( WaitForSingleObject(H_Semaphore_Tragitto_Andata[1],(__Wait_Object_Time * __T3_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T3 *** si assicura che nessun treno gli vada contro...\n");
if ( (pos == 1) && ( WaitForSingleObject(H_Semaphore_Tragitto_Andata[1],(__Wait_Object_Time * __T3_Timewait) ) != WAIT_TIMEOUT ) )
{
printf("*** T3 *** controllo superato,attende il permesso per partire...\n");
if ( WaitForSingleObject(H_Semaphore_Tragitto_Ritorno[1],(__Wait_Object_Time * __T3_Timewait) ) != WAIT_TIMEOUT )
{
pos = 0;
printf("*** T3 *** e' partito dalla stazione C\n");
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[1],2,NULL);
Sleep(__Timerun );
ReleaseSemaphore(H_Semaphore_Tragitto_Ritorno[1],1,NULL);
printf("*** T3 *** e' arrivato alla stazione B\n");
}
}
else
ReleaseSemaphore(H_Semaphore_Tragitto_Andata[1],1,NULL);
}
printf("*** T3 *** fa una sosta alla stazione B\n");
Sleep(__T3_Timewait);
}
}
//----------------------------------------------------------------------------------------------------------------
// Procedura che determina la fine del programma...
//----------------------------------------------------------------------------------------------------------------
HANDLE Finito(LPDWORD lpdwParam)
{
int *fine;
fine=(int*)lpdwParam;
getch();
*fine=1;
return 0;
}
Omissioni:
NOME ARGOMENTO
Qui potete scrivere quello che volete...
Modificato il 2006-05-30 20:33:02 da ChiptuttoFuso
Aggiunzioni:
Torna a Lab Sistemi Operativi
Omissioni:
Torna a Nome Materia
La versione più vecchia di questa pagina è stata modificata il 2006-05-30 20:32:20 da ChiptuttoFuso []
Vista della pagina:
NOME ARGOMENTO
Qui potete scrivere quello che volete...
Torna a Nome Materia