Se connecter avec
S'enregistrer | Connectez-vous

Avez vous le programme des philosophes

Dernière réponse : dans Programmation
Lassé par la pub ? Créez un compte

Bon ben je pensais que ce programme éte connu de tous les programerzz mais je me suis trompé.
Alors voila le sujet:
C'est 5 philosophes qui mangent des spaguettis qui sont trop glissantes. Ils disposent chacun d'une fourchette (5 au total donc) mais le probleme c'est qu'ils ont besoin de 2 fourchettes et doivent donc prendre celle du voisin pour manger. Il faut donc gérer le programme avec des sémaphores pour qu'ils ne mangent pas en même temps et tout.

Donc si qq'un a deja fait ce programme je le prend volontier.

Voila merci beaucoup

FMR-Hunter a écrit
mais pk des philosophes?


Pour qu'ils laissent la main à leurs voisins de temps en temps: un philosophe, ça mange un peu, et puis ça réfléchit, et puis ça re-mange un peu, et puis ça réfléchit...
Si tu mets des gourmands, ils vont se mettre à manger et ne s'arrêteront pas avant d'avoir fini leur assiette, c'est moins intéressant ;) 

Bon les mecs je sais que je peux le trouver dans google mais je demandais si qq'un l'avait deja fait c'est tout comme ca il peut me le filer et c'est plus rapide.

Heu ffomnislash, tu dis que ton prof vous l'a filé t'aurais pas la source :) 
Allez les gars merci pour votre aide.

A ffomnislash: s'il te plait mec il me faut les sources je dois rendre un autre projet lundi et je n'ai pas commencé celui la. J'ai pas vraiment compris les sémaphores et tout et tout alors si j'ai les sources je comprendrai surement mieu.
Merci ffomnislash je compte sur toi.

:lol: 

Ton premier post date du 05, au lieu d'attendre une version toute faite tu aurais pu t'y mettre et le coder ce programme. S'il y a des choses que tu ne comprends pas sur les sémaphores et co, il aurait suffit de demander et tu aurais trouvé des gens pour te les expliquer...
Ca fait peut-être vieux jeu de dire ça, mais comment feras-tu lorsque tu travailleras? Tu demanderas à tes collègues de faire ton travail? Ne rêve pas, ça n'arrivera pas...

Bon alors je vais t'expliquer vite fait, c'est tres simple.
Il se trouve que j'avais 2 projets à faire pendant les vacances mais que je n'habite pas ou je suis à l'ecole. Je suis donc rentrer chez moi SANS mon PC. Ce qu'il fait que je n'ai pas pu travailler mes devoirs d'info. Or cette semaine j'ai choisi de faire le premier projet, beaucoup plus abordable pour moi. C'est pourquoi je n'ai pas vraiment pu me documenter sur les semaphores et companie.
Je comprend tres bien que demander les sources ne m'apportera rien du tout au contraire et qu'en entreprise je ne pourrais pas réagir comme ça.
Mais ceci est un cas d'extreme urgence, et sache que même avec les sources je chercherai à comprendre pour ne pas mourrir con.

Voila en esperant que vous ayez compris mon probleme...
Merci d'avance les gars je compte sur vous

KangOl a écritffomnislash >> un solution serait de lui remettre des sources bugguées jusqu'a l'os :D 


Ca c'est mechant :o 

J'ai pas les sources sur moi, je l'ai aurais peut etre ce soir
ca depend si j'ai pris des notes durant ce cour
Comme je suis gentil je regarderais ce soir ;) 

Bon moi je ne l'ai pas codé, mais je l'ai eu comme exemple pour un TP Unix il y a deux ans.
En espérant que ça t'aide !

  1. /*----------------------------------------------------------
  2.  
  3. Le probleme des philosophes :
  4. threads et variables condition
  5.  
  6. idee : un seul wait par philosophe
  7. => 1 var. condition par philosophe
  8. => condition attachee aux 2 baguettes
  9. => fin de repas : signal sur chacune des var
  10. conditions adjacentes
  11.  
  12. ---------------------------------------------------------*/
  13.  
  14. #include <stdio.h>
  15. #include <pthread.h>
  16.  
  17. #define NbPhilosophes 5
  18. #define TempsMaxRepas 3
  19.  
  20. //------------ debut pack2age condition (termes a adapter a chaque pb)
  21.  
  22. typedef enum {Faux=0,Vrai} bool;
  23. typedef struct {
  24. pthread_cond_t cond;
  25. pthread_mutex_t mutex;
  26. bool baguetteLibre[NbPhilosophes]; /* pour chq philosophe i :
  27. i -> baguette gauche,
  28. i+1 -> baguette droite */
  29. } tpack2;
  30. typedef void (*tfonction1) (tpack2*);
  31. typedef bool (*tfonction2) (tpack2*,int);
  32. typedef void (*tfonction3) (tpack2*,int);
  33.  
  34. tpack2 pack2;
  35.  
  36. void pack2_init(tpack2 *ppack2,tfonction1 initTermes)
  37. {
  38. initTermes(ppack2);
  39. pthread_cond_init(&pack2.cond,NULL);
  40. pthread_mutex_init(&pack2.mutex,NULL);
  41. }
  42.  
  43. void pack2_attendre(tpack2 *ppack2,tfonction2 propositionVraie,int i,tfonction3 action)
  44. {
  45. pthread_mutex_lock(&ppack2->mutex);
  46. while (! propositionVraie(ppack2,i))
  47. pthread_cond_wait(&ppack2->cond,&ppack2->mutex); // deverrouille mutex pendant blocage
  48. if (action!=NULL) action(ppack2,i);
  49. pthread_mutex_unlock(&ppack2->mutex);
  50. }
  51.  
  52. void pack2_signalerTousSystematiquement(tpack2 *ppack2,tfonction3 action,int i)
  53. {
  54. pthread_mutex_lock(&ppack2->mutex);
  55. if (action!=NULL) action(ppack2,i);
  56. pthread_cond_broadcast(&ppack2->cond);
  57. pthread_mutex_unlock(&ppack2->mutex);
  58. }
  59.  
  60.  
  61. //---------------- CODE PHILOSOPHE -----------------------
  62.  
  63. void initTermes(tpack2 *ppack2)
  64. {
  65. int i;
  66. for (i=0;i<NbPhilosophes;i++) {
  67. ppack2->baguetteLibre[i] = Vrai;
  68. }
  69. }
  70.  
  71. bool QlesDeuxBaguettesLibresPour(tpack2 *ppack2,int i)
  72. {
  73. int iPlus1=(i+1) % NbPhilosophes;
  74. return ppack2->baguetteLibre[i] && ppack2->baguetteLibre[iPlus1];
  75. }
  76.  
  77. void prendrelesDeuxBaguettesPour(tpack2 *ppack2,int i)
  78. {
  79. int iPlus1=(i+1) % NbPhilosophes;
  80. ppack2->baguetteLibre[i]=ppack2->baguetteLibre[iPlus1]=Faux;
  81. }
  82.  
  83. void libererlesDeuxBaguettesPour(tpack2 *ppack2,int i)
  84. {
  85. int iPlus1=(i+1) % NbPhilosophes;
  86. ppack2->baguetteLibre[i]=ppack2->baguetteLibre[iPlus1]=Vrai;
  87. }
  88.  
  89. void simule(int i)
  90. {
  91. printf("le philosophe %d commence a manger\n",i);
  92. sleep(rand()%TempsMaxRepas);
  93. printf("le philosophe %d a fini de manger\n",i);
  94. }
  95.  
  96. void* philosophe(void *p)
  97. {
  98. int i= * (int*) p;
  99. pack2_attendre(&pack2,QlesDeuxBaguettesLibresPour,i,prendrelesDeuxBaguettesPour);
  100. simule(i);
  101. pack2_signalerTousSystematiquement(&pack2,libererlesDeuxBaguettesPour,i);
  102. return NULL;
  103. }
  104.  
  105. //---------------------- MAIN ------------------------------
  106.  
  107. main(int argc,char* argv[])
  108. {
  109. pthread_t thread[NbPhilosophes];
  110. int i;
  111. int nom[NbPhilosophes]; // chq philosophe doit connaitre son nom
  112.  
  113. srand(getpid()); // init generateur nb aleatoires
  114. pack2_init(&pack2,initTermes);
  115. for (i=0;i<NbPhilosophes;i++) {
  116. nom[i]=i;
  117. pthread_create(&thread[i],NULL,philosophe,&nom[i]);
  118. }
  119. for (i=0;i<NbPhilosophes;i++)
  120. pthread_join(thread[i],NULL);
  121. printf("-- TOUS LES PHILOSOPHES ONT MANGES --\n");
  122. }

Bon déjà merci à vous.
Ensuite j'ai 2, 3 choses à dire.
Tout d'abord un grand merci à Farvil pour la source, jvais matter ce que ca vos et TENTER DE COMPRENDRE.
Pour KangOl, je suis d'accord d'avoir des sources buguées (mais pas à mort quand meme) comme ça, ça va me faire réflechir, c'est pas une mauvaise idée c'est vrai.
Et pour finir merci aussi à ffomnislash, j'attend tes sources si tu les trouves.

THX ALL !!

Bin dis donc, t'en as de la chance avec tes sources. J'en ai jamais moi des si bien rôties :pt1cable: 

Un conseil : si tu comprends pas en cours, c pas bien mais c pas grave. Par contre, faut ke tu revois les cours ke t'as pas compris dans la semaine ... et là tu comprendras tout ... normalement. Moi ça marche comme ça en tt cas.

Et rien de tel ke d'essayer, de tester, de mettre les mains dans la merde pour pouvoir vraiment comprendre :jap: 
Et ça c pas un philosophe ki l'a dit :lol:  c moi :hello: 
Lassé par la pub ? Créez un compte