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]