Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1711 connectés 

  FORUM HardWare.fr
  Programmation
  C

  LE problème des philosophes

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

LE problème des philosophes

n°994685
NicoEISTI
Posté le 27-02-2005 à 14:59:29  profilanswer
 

Salut à tous!
 
 
je suis actuellement sur le fameux problèmes des philosophes. je programme sous linux, et j'ai un problème de variable.  
Mon problème se situe au nioveau du tableau d'entier state, de taille N  (N est fixé bien sûr!)
Je créé 5 processus, mais apparament, quand l'un d'eux modifie le tableau, les autres n'arrivent pas à voir le smodifications apportées, alors qu'il s'agit d'un tableau (pointeur) et déclaré en variables globales!
Si vous pouviez me filer un ptit coup de main... ce serait sympa.
Merci!


Message édité par NicoEISTI le 06-03-2005 à 10:24:23

---------------
Les grandes âmes ont de la volonté, les faibles n ont que des souhaits.
mood
Publicité
Posté le 27-02-2005 à 14:59:29  profilanswer
 

n°994694
++fab
victime du syndrome IH
Posté le 27-02-2005 à 15:10:24  profilanswer
 

un processus ne partage pas ses variables globales avec les autres processus.
Ce sont les threads qui en sont capables (dans un meme processus bien sur).
Tu peux utiliser aussi la memoire partagée (shmget, shmat, ...), cela permet de partager des données entre plusieurs processus.

n°994698
moi23372
Posté le 27-02-2005 à 15:13:22  profilanswer
 

personnellement, je te conseille d'utilisé les thread, ils sont bien plus simple a programmé...  
 
et je confirme ce que ++fab a dit... deux processus distinct n'ont pas la même zone mémoire qui leur est alloué... donc pas la mm zone CS/DS/SS

n°994699
NicoEISTI
Posté le 27-02-2005 à 15:13:51  profilanswer
 

oula, ok, mais j'ai pas du tout appris à utiliser ces deux fonctions....  elle se trouvent où? tu peux m'en dire un peu plus sur la façon dont je peux arranger mon code avec ces fonctions?


---------------
Les grandes âmes ont de la volonté, les faibles n ont que des souhaits.
n°994701
NicoEISTI
Posté le 27-02-2005 à 15:14:41  profilanswer
 

c'est pas de chance j'ai pas non plus appris à utiliser des threads... ça marche comment?


---------------
Les grandes âmes ont de la volonté, les faibles n ont que des souhaits.
n°994702
moi23372
Posté le 27-02-2005 à 15:14:44  profilanswer
 

la mémoire partagée n'est pas qq de facile a faire... pour cel aje te conseille de faire des threads si ton programme 'nest pas trop gros...
 
sinon tu fais un man des deux fonctions et tu veras comment les utilisés...

n°994704
NicoEISTI
Posté le 27-02-2005 à 15:18:38  profilanswer
 

le prog n'est pas gros, je vais utiliser les threads, enfin je vais essayer....
Merci


---------------
Les grandes âmes ont de la volonté, les faibles n ont que des souhaits.
n°994705
moi23372
Posté le 27-02-2005 à 15:19:18  profilanswer
 

moi23372 a écrit :

la mémoire partagée n'est pas qq de facile a faire... pour cel aje te conseille de faire des threads si ton programme 'nest pas trop gros...
 
sinon tu fais un man des deux fonctions et tu veras comment les utilisés...


 
pour les threads, c'est pas compliqué, je vais essayé de te donné un pti exemple assez simple pour que tu comprennes...
 

Code :
  1. void * fctThread1 (void *param);
  2. void * fctThread2 (void *param);
  3. pthread_t handleThread1;
  4. pthread_t handleThread2;
  5. int main()
  6. {
  7. pthread_create (&handleThread1, 0, (void *(*)(void*)) fctThread1, 0);
  8. pthread_create (&handleThread1, 0, (void *(*)(void*)) fctThread1, 0);
  9. pthread_join (handleThread1, NULL); //attent la fin du thread1
  10. pthread_join (handleThread2, NULL); //attent la fin du thread2
  11. exit(0);
  12. }
  13. void * fctThread1 (void *param)
  14. {
  15. //code de son sous processus1
  16. pthread_exit(NULL);
  17. }
  18. void * fctThread1 (void *param)
  19. {
  20. //code de son sous processus2
  21. pthread_exit(NULL);
  22. }

n°994708
NicoEISTI
Posté le 27-02-2005 à 15:20:23  profilanswer
 

euh en fait la mémoire pârtagée c'est avec les mutex ! :D
j'ai appris à les utiliser, MDR


---------------
Les grandes âmes ont de la volonté, les faibles n ont que des souhaits.
n°994711
NicoEISTI
Posté le 27-02-2005 à 15:24:02  profilanswer
 

Merci pour l'exmple, mais je dois faire sans les threads, je dois forcément utiliser des fork


---------------
Les grandes âmes ont de la volonté, les faibles n ont que des souhaits.
mood
Publicité
Posté le 27-02-2005 à 15:24:02  profilanswer
 

n°994716
NicoEISTI
Posté le 27-02-2005 à 15:33:26  profilanswer
 

Bon, c'est clair, il faut que je dois créer un segment de mémoire partagée, et y mettre mon tableau de 5 entiers, pour que mes processus puissent y accéder. Vous pouvez me file un coup de main pour faire ça?


---------------
Les grandes âmes ont de la volonté, les faibles n ont que des souhaits.
n°994757
Sve@r
Posté le 27-02-2005 à 16:22:20  profilanswer
 

NicoEISTI a écrit :

Bon, c'est clair, il faut que je dois créer un segment de mémoire partagée, et y mettre mon tableau de 5 entiers, pour que mes processus puissent y accéder. Vous pouvez me file un coup de main pour faire ça?


 
1) un premier processus crée un segment de mémoire partagée avec "shmget(clef, taille, option)". Cette fonction te renvoie un identifiant "id".
2) il te faut attacher ce segment avec "shmat(id)". Cette fonction te renvoie un "void*" pointant vers ta mémoire partagée que tu récupères dans un pointeur "pt" de type que tu veux
3) maintenant tu as à ta disposition un pointeur "pt" pointant vers une zone de "x" octets. Tu peux donc écrire dans cette zone où tu veux (à toi de ne pas aller là où il faut pas).

pt[...]=valeur


Et tout processus réalisant les opérations "1" et "2" pourra lui-aussi écrire au même endroit ou lire ce qu'il y a été mis (sauf que les autres processus qui veulent accéder à la zone n'auront pas besoin de spécifier la taille dans "shmget()" ).
 
Une fois tes opérations terminées, tu dois détacher ton pointeur "pt" de ta zone => shmdet(pt). Si t'as plus besoin de ta zone tu peux la supprimer => shmctl(id, IPC_RMID)
 
 
Maintenant je ne comprends pas trop pourquoi tes processus ont besoin de s'échanger des valeurs. Moi, quand j'ai écrit l'algo des philosophes, je n'ai utilisé que les sémaphores
1) je génère un tableau de P sémaphores, P étant le nombre de philosophes
2) je génère autant de processus que de philosophes. Chaque processus connait la taille du plat qu'il doit avaler et la taille de sa fourchette (définies au début du programme)
3) quand un philosophe veut manger, il prend en une seule opération
- son sémaphore
- le sémaphore de son voisin (de droite ou de gauche ça importe peu mais si tu décides la droite, tous prennent celui de droite)
Si l'opération est permise (2 sémaphores libres), le processus mange (sa quantité décroit) et garde son sémaphore qq secondes pour que tu puisses voir ton algo tourner. Si l'opération n'est pas permise ben tant pis, le philosophe attend.  
4) une fois qu'il a fini sa cuillère, le processus rend les deux sémaphores en une seule opération. Dès que son plat est vide, il se termine.
 
Avec cet algo, aucun processus n'a besoin d'envoyer des infos à un autre. Chaque processus mange quand il peut et tous coopèrent.


Message édité par Sve@r le 27-02-2005 à 16:36:10

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°994894
NicoEISTI
Posté le 27-02-2005 à 18:30:02  profilanswer
 

quand tu dis que les autres processus n'auront pas besoin de préciser la taille, je mets quoi dans le champ taille de la fonction shmget?


---------------
Les grandes âmes ont de la volonté, les faibles n ont que des souhaits.
n°994929
Sve@r
Posté le 27-02-2005 à 19:05:41  profilanswer
 

NicoEISTI a écrit :

quand tu dis que les autres processus n'auront pas besoin de préciser la taille, je mets quoi dans le champ taille de la fonction shmget?


 
T'as le choix entre remettre exactement la même taille ou mettre la valeur neutre "0".
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  LE problème des philosophes

 

Sujets relatifs
[REGLE ] Probleme de couleurProblème popup image
probleme avec formailProbleme de syntaxe
Probleme avec la page d'accueil de mon siteProbleme d'analyse lexicale
[JS] Probleme de neuneuProbleme c++ et appli windows
Problème sur le modèle conceptuel d'un lycée. Identifiant "double".Problème d'affichage en PERL sous UNIX
Plus de sujets relatifs à : LE problème des philosophes


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR