Page principale   Modules   Liste des composants   Liste des fichiers   Composants   Déclarations  

Référence du fichier philo.c

Le problème des N philosophes. Plus de détails...

#include "fred.h"
#include "sema.h"


Description détaillée

L'évitement de l'interblocage est assuré par :
#include "fred.h"
#include "sema.h"
#define NBphilo  7
FredThread philosophe[NBphilo];
FredSemaphore fourchette[NBphilo];
FredSemaphore finRepas;

 void* codephilo(void * x)
{
  int j,k;
  int i = (int)x;
  FredPrintf(" \n philo %d numero %d demarre \n ",  FredThreadCurrent(),i);
  for( j=0;j<100;j++){ 
    FredPrintf(" \n philo %d pense %d éme fois \n ", i,j);
    for(k=0;k<1000000;k++); /* ça pense ..*/
    FredThreadYield(); 
    FredPrintf(" \n philo %d veut manger %d éme fois \n ", i,j);
    if(i<(NBphilo-1)){ /* un droitier */
      FredSemaphoreP(&fourchette[i]);FredSemaphoreP(&fourchette[i+1]);
      FredPrintf(" \n philo droitier %d mange %d éme fois \n ", i,j);
      for( k=0;k<1000000;k++); /* ça mange ..*/
      FredThreadYield();
      FredSemaphoreV(&fourchette[i]);FredSemaphoreV(&fourchette[i+1]);
    }else{ /* le gaucher */
      FredSemaphoreP(&fourchette[0]);FredSemaphoreP(&fourchette[NBphilo-1]);
      FredPrintf(" \n philo GAUCHER %d mange %d éme fois \n ", i,j);
      for( k=0;k<1000000;k++);/* ça mange ..*/
      FredThreadYield();
      FredSemaphoreV(&fourchette[0]);FredSemaphoreV(&fourchette[NBphilo-1]);
    }
  }
  FredSemaphoreV(&finRepas); 
  FredPrintf(" \n philo  %d ADIEU \n ", i);
  return (void*) 0;
}

int main ( int argc, char** argv)
{
  int i;
  printf(" C'est parti \n");
  FredInitialize();
  for( i=0;i<NBphilo;i++)
  {
    FredSemaphoreInit(&fourchette[i],1);
    FredPrintf("Initialisation fourchette[%d]]  \n ",  i);
  }
  FredSemaphoreInit(&finRepas,0);
  for( i=0;i<NBphilo;i++)
  {
   philosophe[i]= FredThreadSpawn(20000,codephilo,(void*)i,(void**)0);
   FredPrintf("Lancement philosophe[%d]]  \n ",  i);
  }
  FredPrintf("philodsophes lancés !!!!  \n ");
  for(i=0;i<NBphilo;i++)FredSemaphoreP(&finRepas);
  FredPrintf("philosophes repus !!!!  \n ");
  FredWaitTerminate();
  printf(" C'est termine \n");
  return 0;
}





Généré le Mon Jan 5 16:22:06 2004 par doxygen1.2.17