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 "phil.h"
#include "psema.h"


Description détaillée

L'évitement de l'interblocage est assuré par :
#include "phil.h"
#include "psema.h"


#define NBphilo  7
PhilThread philosophe[NBphilo];
PhilSemaphore fourchette[NBphilo];





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




int main ( int argc, char** argv)
{
  int i; 
  printf(" C'est parti \n");
  PhilInitialize();
  for( i=0;i<NBphilo;i++)
  {
    PhilSemaphoreInit(&fourchette[i],1);
    PhilPrintf("Initialisation fourchette[%d]]  \n ",  i);
  }
  for( i=0;i<NBphilo;i++)
  {
   philosophe[i]= PhilThreadCreate(0, 0,20000,codephilo,(void*)i);
   PhilPrintf("Lancement philosophe[%d]]  \n ",  i);
  }
  PhilPrintf("philodsophes lancés !!!!  \n ");
  for(i=0;i<NBphilo;i++)PhilThreadJoin(philosophe[i], 0);
  PhilPrintf("philosophes repus !!!!  \n ");
  PhilWaitTerminate();
  printf(" C'est termine \n");
  return 0;
}





Généré le Thu Jan 15 15:49:02 2004 par doxygen1.2.17