INFOPedia : LSOCriticalFilosofi

HomePage :: Categorie :: Indice :: Ultime modifiche :: Ultimi commenti :: Login/Registrazione

Filosofi e Critical Section


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...).
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

There are 2 comments on this page. [Visualizza commenti]

Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by Wikka Wakka Wiki 1.1.6.1
La pagina è stata generata in 0.2308 secondi