La versione più recente è stata modificata il 2006-06-07 21:28:05 da AntarellO [aggiungo precisazione]
Aggiunzioni:
In questo semplice esempio si vuole simulare il problema dei filosofi a cena utilizzando Critical Section (nonostante l'utilizzo che se ne fa non sia quello proprio per il quale sono state pensate...).
Omissioni:
In questo semplice esempio si vuole simulare il problema dei filosofi a cena utilizzando Critical Section.
Modificato il 2006-06-07 16:31:31 da DenteDiLupo [Aggiunto titolo]
Aggiunzioni:
Filosofi e Critical Section
La versione più vecchia di questa pagina è stata modificata il 2006-06-04 22:42:46 da AntarellO []
Vista della pagina:
In questo semplice esempio si vuole simulare il problema dei filosofi a cena utilizzando Critical Section.
Dato che lo scopo del programma è unicamente comprendere meglio l'uso delle Critical Section non ho badato scrivere un codice elegante.
Considerata l'ordinata politica con la quale i filosofi entrano ed escono dalle sezioni critiche, non si presentano evidenti occasioni di stallo; il programma gestisce le risorse in modo equo, a fine esecuzione è possibile verificare che in media ogni filosofo ha mangiato tanto quanto qualsiasi altro filosofo.
Il listato è decisamente essenziale per cui ritengo superfluo ogni commento.
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <ctype.h>
#define EATS 500
#define THINK 250
CRITICAL_SECTION forchetta1,forchetta2,forchetta3,forchetta4,forchetta5;
int count[4]; //Questa variabile tiene conto di quante volte il filosofo i ha mangiato
void filosofo1(void *param);
void filosofo2(void *param);
void filosofo3(void *param);
void filosofo4(void *param);
void filosofo5(void *param);
int main() {
HANDLE hFilosofo1,hFilosofo2,hFilosofo3,hFilosofo4,hFilosofo5;
DWORD idFilosofo1,idFilosofo2,idFilosofo3,idFilosofo4,idFilosofo5;
int i;
InitializeCriticalSection(&forchetta1);
InitializeCriticalSection(&forchetta2);
InitializeCriticalSection(&forchetta3);
InitializeCriticalSection(&forchetta4);
InitializeCriticalSection(&forchetta5);
hFilosofo1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)filosofo1,NULL,0,&idFilosofo1);
hFilosofo2=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)filosofo2,NULL,0,&idFilosofo2);
hFilosofo3=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)filosofo3,NULL,0,&idFilosofo3);
hFilosofo4=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)filosofo4,NULL,0,&idFilosofo4);
hFilosofo5=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)filosofo5,NULL,0,&idFilosofo5);
getch();
TerminateThread(hFilosofo1,0);
TerminateThread(hFilosofo2,0);
TerminateThread(hFilosofo3,0);
TerminateThread(hFilosofo4,0);
TerminateThread(hFilosofo5,0);
for (i=0;i<4;i++)
printf("Il filosofo %d ha mangiato %d volte\n", i+1, count[i]);
return 0;
}
void filosofo1(void *param){
while (1){
printf("Il filosofo 1 sta pensando...\n");
Sleep(THINK);
EnterCriticalSection(&forchetta1);
EnterCriticalSection(&forchetta2);
printf("Il filosofo 1 sta mangiando...\n");
Sleep(EAT);
printf("Il filosofo 1 ha finito di mangiare e rilascia le forchette\n\n");
count[0]++;
LeaveCriticalSection(&forchetta2);
LeaveCriticalSection(&forchetta1);
}
}
void filosofo2(void *param){
while (1){
printf("Il filosofo 2 sta pensando...\n");
Sleep(THINK);
EnterCriticalSection(&forchetta2);
EnterCriticalSection(&forchetta3);
printf("Il filosofo 2 sta mangiando...\n");
Sleep(EAT);
printf("Il filosofo 2 ha finito di mangiare e rilascia le forchette\n");
count[1]++;
LeaveCriticalSection(&forchetta3);
LeaveCriticalSection(&forchetta2);
}
}
void filosofo3(void *param){
while (1){
printf("Il filosofo 3 sta pensando...\n");
Sleep(THINK);
EnterCriticalSection(&forchetta3);
EnterCriticalSection(&forchetta4);
printf("Il filosofo 3 sta mangiando...\n");
Sleep(EAT);
printf("Il filosofo 3 ha finito di mangiare e rilascia le forchette\n");
count[2]++;
LeaveCriticalSection(&forchetta4);
LeaveCriticalSection(&forchetta3);
}
}
void filosofo4(void *param){
while (1){
printf("Il filosofo 4 sta pensando...\n");
Sleep(THINK);
EnterCriticalSection(&forchetta4);
EnterCriticalSection(&forchetta5);
printf("Il filosofo 4 sta mangiando...\n");
Sleep(EAT);
printf("Il filosofo 4 ha finito di mangiare e rilascia le forchette\n");
count[3]++;
LeaveCriticalSection(&forchetta5);
LeaveCriticalSection(&forchetta4);
}
}
void filosofo5(void *param){
while (1){
printf("Il filosofo 5 sta pensando...\n");
Sleep(THINK);
EnterCriticalSection(&forchetta5);
EnterCriticalSection(&forchetta1);
printf("Il filosofo 5 sta mangiando...\n");
Sleep(EAT);
printf("Il filosofo 5 ha finito di mangiare e rilascia le forchette\n");
count[4]++;
LeaveCriticalSection(&forchetta1);
LeaveCriticalSection(&forchetta5);
}
}
Torna a Laboratorio di Sistemi Operativi