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]