INFOPedia : LSOMutexAutoloavaggio

HomePage :: Categorie :: Indice :: Ultime modifiche :: Ultimi commenti :: Login/Registrazione
La versione più recente è stata modificata il 2006-06-08 17:51:37 da AntarellO [corretta GetRandom]

Aggiunzioni:
#define GetRandom(min,max) (rand()%((int)(max)-(min)+1)+(min))

Omissioni:
#define GetRandom(min,max) ((rand()%(int)(max)+(min)))



Modificato il 2006-06-03 15:05:54 da DenteDiLupo [corretto titolo]

Aggiunzioni:

Autolavaggio



Omissioni:

AutoLavaggio





Modificato il 2006-06-03 15:04:01 da ChiptuttoFuso

Aggiunzioni:

AutoLavaggio





Modificato il 2006-06-03 15:03:13 da ChiptuttoFuso

Aggiunzioni:
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.




Modificato il 2006-06-03 15:01:20 da ChiptuttoFuso

Aggiunzioni:
Torna a Lab Sistemi Operativi



Modificato il 2006-06-03 14:59:22 da ChiptuttoFuso

Aggiunzioni:




#define Lavaggi 3
#define t 2000
HANDLE H_Mutex_Lavaggi[
Lavaggi];

Definisco le procedure e le funzioni del listato...

#define GetRandom(min,max) ((rand()%(int)(max)+(min)))
HANDLE finito(LPDWORD lpdwParam);
void car(int *count);

Procedura 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]);


Omissioni:

Problema dei taghetti

In un arcipelago composto da due isole (per semplicità chiamati A e B) sono collegate alla terra ferma e tra di loro da due traghetti (per semplicità T1 e T2) , in funzione 24 ore su 24 e che collgano T1 la terra ferma all'isola A , e T2 l'isola A all'isola B . L'isola A ha un porto molto piccolo e consente uno solo dei due traghetti di attraccare quindi Il tragetti partono nel momento in cui o hanno raggiungono il loro carico massimo (MAXLOADT1 e MAXLOADT2) o se uno dei due e attraccato sull'isola A e sta sopragiungendo l'altro traghetto.

Compito per gli alunni di secondo anno

1. Scrivere il programma Tragretti in C che abbia le i seguenti processi:
Trag1;
Trag2;
Il programma deve soddisfare alle seguenti caratteristiche:
a) assenza di deadlock
b) assenza di partenze con carico maggiore dal consentito
c) assenza di attrachi contemporanei sull'isola A.

2. Spiegare come le proprietà a)-c) sono rispettate dal vostro algoritmo.



Definisco le funzioni e procedure...

#define GetRandom(min,max) ((rand()%(int)(max)+(min)))


#define T 2000
definisco un tempo di percorrenza tra 2 porti
#define max_T1 10 definisco il carico massimo del traghetto T1
#define max_T2 20
definisco il carico massimo del traghetto T2
HANDLE H_Mutex_A; definisco un handle per l'isola A
int porto[2];
variabile che mi indica dove è attraccato il traghetto Tn
CRITICAL_SECTION stampa; no comment
void Trag1();
void Trag2();

MAIN...

inizializzo la critical section
InitializeCriticalSection(&stampa);
Creo il mutex
H_Mutex_A = CreateMutex(NULL,false,NULL);
inizializzo le posizioni di partenza dei traghetti
porto[0] = 0;
il traghetto T1 parte dalla terra ferma
porto[1] = 0; il traghetto T2 parte dal porto dell'isola B
Creo i due thread dei traghetti
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Trag1,NULL,0,NULL);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Trag2,NULL,0,NULL);
while (getch() != 'q');

Trag1...

void Trag1()
int carico = 0; variabile che mi indica il carico attuale del traghetto
int finito; variabile che mi indica se ho finito di caricare
int temp;
variabile per il carico da aggiungere
while (1)
controllo se il traghetto è nella terra ferma
if (porto[0]
0) {
il traghetto è attraccato al porto di terra ferma con carico = 0
carico = 0;
finito = 0;
finchè non è completamente carico non parte
while ( (carico < max_T1) && (finito
0) ) {
arriva un carico
randomize;
temp = GetRandom(1,5);
if ( (carico+temp) <= max_T1)
{
carico = carico + temp;
}
else
{
finito = 1;
}
}
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T1 ha caricato %d\n",carico);
esco dalla critical section <
LeaveCriticalSection(&stampa);
una volta carico,deve partire per il porto dell'isola A
controllo se il porto dell'isola A è libero
if ( porto[1]
0 ) {
WaitForSingleObject(H_Mutex_A,INFINITE);
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il porto A e' libero,il traghetto T1,carico di merda,parte...\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
Sleep(T);
porto[0] = 1;
entro nella critical section <
EnterCriticalSection(&stampa);

printf("il traghetto T1 e' arrivato al porto dell'isola A,scarica la merce...\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
}
altrimenti,costringo il traghetto T2 a levarsi dalle palle.
else
{
indico a T2 che T1 sta partendo per il porto dell'isola A
porto[0] = 1;
WaitForSingleObject(H_Mutex_A,INFINITE);
entro nella critical section <
EnterCriticalSection(&stampa);
printf("nel porto A c'era T2,lo mando a cagar,e parto...\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
Sleep(T);

entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T1 e' arrivato al porto dell'isola A,scarica la merce...\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
}
}
controllo se il traghetto si trova nel porto dell'isola A
else
{
il taghetto è attraccato al porto dell'isola A con carico = 0
carico = 0;
finito = 0;
parte o quando è completamente carico,o quando T2 chiede l'attracco al porto A.
while ( ( carico < max_T1 ) && ( porto[1] 0) && (finito
0) ) {
arriva un carico
randomize;
temp = GetRandom(1,5);
if ( (carico+temp) <= max_T1)
{
carico = carico + temp;
}
else
{
finito = 1;
}
}
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T1 ha caricato %d\n",carico);
esco dalla critical section <
LeaveCriticalSection(&stampa);
ReleaseMutex(H_Mutex_A);
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T1 e' partito dal porto dell'isola A\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
Sleep(T);
porto[0] = 0;
}

Trag2...

void Trag2()
int carico = 0; variabile che mi indica il carico attuale del traghetto
int finito; variabile che mi indica se ho finito di caricare
int temp;
variabile per il carico da aggiungere
while (1)
controllo se il traghetto è nella terra ferma
if (porto[1] 0) {
il traghetto è attraccato al porto di terra ferma con carico = 0
carico = 0;
finito = 0;
finchè non è completamente carico non parte
while ( (carico < max_T2) && (finito
0) ) {
arriva un carico
randomize;
temp = GetRandom(1,5);
if ( (carico+temp) <= max_T2)
{
carico = carico + temp;
}
else
{
finito = 1;
}
}
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T2 ha caricato %d\n",carico);
esco dalla critical section <
LeaveCriticalSection(&stampa);
una volta carico,deve partire per il porto dell'isola A
controllo se il porto dell'isola A è libero
if ( porto[0]
0 ) {
WaitForSingleObject(H_Mutex_A,INFINITE);
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il porto A e' libero,il traghetto T2,carico di merda,parte...\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
Sleep(T);
porto[1] = 1;
entro nella critical section <
EnterCriticalSection(&stampa);

printf("il traghetto T2 e' arrivato al porto dell'isola A,scarica la merce...\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
}
altrimenti,costringo il traghetto T1 a levarsi dalle palle.
else
{
indico a T1 che T2 sta partendo per il porto dell'isola A
porto[1] = 1;
WaitForSingleObject(H_Mutex_A,INFINITE);
entro nella critical section <
EnterCriticalSection(&stampa);
printf("nel porto A c'era T1,lo mando a cagar,e parto...\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
Sleep(T);

entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T2 e' arrivato al porto dell'isola A,scarica la merce...\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
}
}
controllo se il traghetto si trova nel porto dell'isola A
else
{
il taghetto è attraccato al porto dell'isola A con carico = 0
carico = 0;
finito = 0;
parte o quando è completamente carico,o quando T2 chiede l'attracco al porto A.
while ( ( carico < max_T2 ) && ( porto[0]
0) && (finito
0) ) {
arriva un carico
randomize;
temp = GetRandom(1,5);
if ( (carico+temp) <= max_T2)
{
carico = carico + temp;
}
else
{
finito = 1;
}
}
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T2 ha caricato %d\n",carico);
esco dalla critical section <
LeaveCriticalSection(&stampa);
ReleaseMutex(H_Mutex_A);
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T2 e' partito dal porto dell'isola A\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
Sleep(T);
porto[1] = 0;
}



Modificato il 2006-06-03 14:54:56 da ChiptuttoFuso

Aggiunzioni:
Trag1;
Trag2;

Omissioni:
Trag1 ();
Trag2();




Modificato il 2006-06-03 14:54:29 da ChiptuttoFuso [aggiunto testo esercizio]

Aggiunzioni:
In un arcipelago composto da due isole (per semplicità chiamati A e B) sono collegate alla terra ferma e tra di loro da due traghetti (per semplicità T1 e T2) , in funzione 24 ore su 24 e che collgano T1 la terra ferma all'isola A , e T2 l'isola A all'isola B . L'isola A ha un porto molto piccolo e consente uno solo dei due traghetti di attraccare quindi Il tragetti partono nel momento in cui o hanno raggiungono il loro carico massimo (MAXLOADT1 e MAXLOADT2) o se uno dei due e attraccato sull'isola A e sta sopragiungendo l'altro traghetto.

Compito per gli alunni di secondo anno

1. Scrivere il programma Tragretti in C che abbia le i seguenti processi:
Trag1 ();
Trag2();
Il programma deve soddisfare alle seguenti caratteristiche:
a) assenza di deadlock
b) assenza di partenze con carico maggiore dal consentito
c) assenza di attrachi contemporanei sull'isola A.

2. Spiegare come le proprietà a)-c) sono rispettate dal vostro algoritmo.


Omissioni:
Devo aggiungere il testo



Modificato il 2006-06-03 14:18:02 da ChiptuttoFuso

Aggiunzioni:
%%



Modificato il 2006-06-03 14:17:45 da ChiptuttoFuso [da completare]

Aggiunzioni:

Problema dei taghetti

Devo aggiungere il testo



Definisco le funzioni e procedure...

#define GetRandom(min,max) ((rand()%(int)(max)+(min)))


#define T 2000
definisco un tempo di percorrenza tra 2 porti
#define max_T1 10 definisco il carico massimo del traghetto T1
#define max_T2 20
definisco il carico massimo del traghetto T2
HANDLE H_Mutex_A; definisco un handle per l'isola A
int porto[2];
variabile che mi indica dove è attraccato il traghetto Tn
CRITICAL_SECTION stampa; no comment
void Trag1();
void Trag2();

MAIN...

inizializzo la critical section
InitializeCriticalSection(&stampa);
Creo il mutex
H_Mutex_A = CreateMutex(NULL,false,NULL);
inizializzo le posizioni di partenza dei traghetti
porto[0] = 0;
il traghetto T1 parte dalla terra ferma
porto[1] = 0; il traghetto T2 parte dal porto dell'isola B
Creo i due thread dei traghetti
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Trag1,NULL,0,NULL);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Trag2,NULL,0,NULL);
while (getch() != 'q');

Trag1...

void Trag1()
int carico = 0; variabile che mi indica il carico attuale del traghetto
int finito; variabile che mi indica se ho finito di caricare
int temp;
variabile per il carico da aggiungere
while (1)
controllo se il traghetto è nella terra ferma
if (porto[0]
0)
il traghetto è attraccato al porto di terra ferma con carico = 0
carico = 0;
finito = 0;
finchè non è completamente carico non parte
while ( (carico < max_T1) && (finito
0) ) {
arriva un carico
randomize;
temp = GetRandom(1,5);
if ( (carico+temp) <= max_T1)
{
carico = carico + temp;
}
else
{
finito = 1;
}
}
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T1 ha caricato %d\n",carico);
esco dalla critical section <
LeaveCriticalSection(&stampa);
una volta carico,deve partire per il porto dell'isola A
controllo se il porto dell'isola A è libero
if ( porto[1]
0 ) {
WaitForSingleObject(H_Mutex_A,INFINITE);
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il porto A e' libero,il traghetto T1,carico di merda,parte...\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
Sleep(T);
porto[0] = 1;
entro nella critical section <
EnterCriticalSection(&stampa);

printf("il traghetto T1 e' arrivato al porto dell'isola A,scarica la merce...\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
}
altrimenti,costringo il traghetto T2 a levarsi dalle palle.
else
{
indico a T2 che T1 sta partendo per il porto dell'isola A
porto[0] = 1;
WaitForSingleObject(H_Mutex_A,INFINITE);
entro nella critical section <
EnterCriticalSection(&stampa);
printf("nel porto A c'era T2,lo mando a cagar,e parto...\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
Sleep(T);

entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T1 e' arrivato al porto dell'isola A,scarica la merce...\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
}
controllo se il traghetto si trova nel porto dell'isola A
else
il taghetto è attraccato al porto dell'isola A con carico = 0
carico = 0;
finito = 0;
parte o quando è completamente carico,o quando T2 chiede l'attracco al porto A.
while ( ( carico < max_T1 ) && ( porto[1] 0) && (finito
0) ) {
arriva un carico
randomize;
temp = GetRandom(1,5);
if ( (carico+temp) <= max_T1)
{
carico = carico + temp;
}
else
{
finito = 1;
}
}
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T1 ha caricato %d\n",carico);
esco dalla critical section <
LeaveCriticalSection(&stampa);
ReleaseMutex(H_Mutex_A);
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T1 e' partito dal porto dell'isola A\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
Sleep(T);
porto[0] = 0;

Trag2...

void Trag2()
int carico = 0; variabile che mi indica il carico attuale del traghetto
int finito; variabile che mi indica se ho finito di caricare
int temp;
variabile per il carico da aggiungere
while (1)
controllo se il traghetto è nella terra ferma
if (porto[1] 0)
il traghetto è attraccato al porto di terra ferma con carico = 0
carico = 0;
finito = 0;
finchè non è completamente carico non parte
while ( (carico < max_T2) && (finito
0) ) {
arriva un carico
randomize;
temp = GetRandom(1,5);
if ( (carico+temp) <= max_T2)
{
carico = carico + temp;
}
else
{
finito = 1;
}
}
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T2 ha caricato %d\n",carico);
esco dalla critical section <
LeaveCriticalSection(&stampa);
una volta carico,deve partire per il porto dell'isola A
controllo se il porto dell'isola A è libero
if ( porto[0]
0 ) {
WaitForSingleObject(H_Mutex_A,INFINITE);
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il porto A e' libero,il traghetto T2,carico di merda,parte...\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
Sleep(T);
porto[1] = 1;
entro nella critical section <
EnterCriticalSection(&stampa);

printf("il traghetto T2 e' arrivato al porto dell'isola A,scarica la merce...\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
}
altrimenti,costringo il traghetto T1 a levarsi dalle palle.
else
{
indico a T1 che T2 sta partendo per il porto dell'isola A
porto[1] = 1;
WaitForSingleObject(H_Mutex_A,INFINITE);
entro nella critical section <
EnterCriticalSection(&stampa);
printf("nel porto A c'era T1,lo mando a cagar,e parto...\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
Sleep(T);

entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T2 e' arrivato al porto dell'isola A,scarica la merce...\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
}
controllo se il traghetto si trova nel porto dell'isola A
else
il taghetto è attraccato al porto dell'isola A con carico = 0
carico = 0;
finito = 0;
parte o quando è completamente carico,o quando T2 chiede l'attracco al porto A.
while ( ( carico < max_T2 ) && ( porto[0]
0) && (finito
0) ) {
arriva un carico
randomize;
temp = GetRandom(1,5);
if ( (carico+temp) <= max_T2)
{
carico = carico + temp;
}
else
{
finito = 1;
}
}
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T2 ha caricato %d\n",carico);
esco dalla critical section <
LeaveCriticalSection(&stampa);
ReleaseMutex(H_Mutex_A);
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T2 e' partito dal porto dell'isola A\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
Sleep(T);
porto[1] = 0;

Omissioni:

Autolavaggio con Mutex

Implementare un autolavaggio con 3 lavaggi differenti.
Ogni lavaggio può riceve una sola macchina per volta.
Le macchine grandi possono entrare solo nel primo lavaggio,le macchine piccole invece in ognuno dei tre.
Il tempo di sgrasciamento è dirverso per ogni lavaggio:
lavaggio1 = t
lavaggio2 = 2t
lavaggio3 = 3t




#define Lavaggi 3
#define t 2000
HANDLE H_Mutex_Lavaggi[
Lavaggi];

Definisco le procedure e le funzioni del listato...

#define GetRandom(min,max) ((rand()%(int)(max)+(min)))
HANDLE finito(LPDWORD lpdwParam);
void car(int *count);

Procedura 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 all'elenco dei capitoli



Modificato il 2006-05-28 11:37:09 da Bruno82 [lettere accentate]

Aggiunzioni:
Ogni lavaggio può riceve una sola macchina per volta.
Il tempo di sgrasciamento è dirverso per ogni lavaggio:
Creo il thread per gestire la fine del programma,e ne controllo la validità

Omissioni:
Ogni lavaggio puÚ riceve una sola macchina per volta.
Il tempo di sgrasciamento Ë dirverso per ogni lavaggio:
Creo il thread per gestire la fine del programma,e ne controllo la validit‡



Modificato il 2006-05-27 15:34:01 da DenteDiLupo [sistemato testo del problema]

Aggiunzioni:
Implementare un autolavaggio con 3 lavaggi differenti.
Ogni lavaggio puÚ riceve una sola macchina per volta.
Le macchine grandi possono entrare solo nel primo lavaggio,le macchine piccole invece in ognuno dei tre.
Il tempo di sgrasciamento Ë dirverso per ogni lavaggio:
lavaggio1 = t
lavaggio2 = 2t
lavaggio3 = 3t

Omissioni:
/* Il fottuto autolavaggio....
Implementare un autolavaggio con 3 lavaggi differenti.
Ogni lavaggio puÚ riceve una sola macchina per volta.
Le macchine grandi possono entrare solo nel primo lavaggio,le macchine piccole invece in ognuno dei tre.
Il tempo di sgrasciamento Ë dirverso per ogni lavaggio:
lavaggio1 = t
lavaggio2 = 2t
lavaggio3 = 3t
*/




Modificato il 2006-05-26 12:01:24 da SoNiC [titolo e link capitoli]

Aggiunzioni:

Autolavaggio con Mutex


Torna all'elenco dei capitoli




Modificato il 2006-05-26 11:56:53 da ChiptuttoFuso

Aggiunzioni:
%%(cpp)
/* Il fottuto autolavaggio....
Implementare un autolavaggio con 3 lavaggi differenti.
Ogni lavaggio puÚ riceve una sola macchina per volta.
Le macchine grandi possono entrare solo nel primo lavaggio,le macchine piccole invece in ognuno dei tre.
Il tempo di sgrasciamento Ë dirverso per ogni lavaggio:
lavaggio1 = t
lavaggio2 = 2t
lavaggio3 = 3t
*/
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...
Creo il thread per gestire la fine del programma,e ne controllo la validit‡

Omissioni:
%%(c)

Creo il thread per gestire la fine del programma,e ne controllo la validità



Modificato il 2006-05-26 11:54:31 da DenteDiLupo

Aggiunzioni:
%%(c)



Modificato il 2006-05-26 11:53:49 da SoNiC

Aggiunzioni:




La versione più vecchia di questa pagina è stata modificata il 2006-05-26 11:47:47 da SoNiC []
Vista della pagina:

#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)))
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]);
}
}
Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by Wikka Wakka Wiki 1.1.6.1
La pagina è stata generata in 0.2982 secondi