problème d'accès variable entre deux threads

problème d'accès variable entre deux threads - C++ - Programmation

Marsh Posté le 24-07-2007 à 13:44:05    

Salut à tous,
 
je suis en train de bosser sur un petit programme qui ouvre un thread pour écouter un port tcp (récupère donc un char* qui contient du xml) et qui a un second thread qui doit récupérer ce message xml pour le parser.
j'ai fais pour cela deux classe, une qui gère l'écoute et une qui gère le parsage mais j'ai un problème pour la récupération de la variable contenant le message xml de ma classe d'écoute avec ma classe de parsage.
 
voici les extraits de codes utiles à comprendre mon prog
 

Code :
  1. --- definition des methodes et classes ---
  2. typedef struct
  3. {
  4.     int nb;             // Nombre d'octets recus
  5.     char buf[1500];
  6. } Recv;
  7. class Listener
  8. {
  9.     public:
  10.     Listener();
  11.     void lecture(); // lecture sur la socket
  12.     Recv get_buffer(); // renvoie du buffer
  13.     void set_listener(Sock L_socket); //mis en place de la socket
  14.     pthread_mutex_t verrou;
  15.     private:
  16.     Sock listener; // structure contenant la socket
  17.     Recv ret;
  18. };
  19. void Listener::lecture()
  20. {
  21.     cout << "Lancement de la lecture" << endl;
  22.     while (1))
  23.     {
  24.         Recv temp;
  25.         temp.nb = -1;
  26.         memset (ret.buf, 0, sizeof (ret.buf));
  27.         temp=recv(listener);
  28.         pthread_mutex_lock( &verrou );
  29.         ret.nb = temp.nb;
  30.         strcpy(ret.buf, temp.buf);
  31.         pthread_mutex_unlock( &verrou );
  32.        cout << "sortie 1" << endl << ret.nb << endl << ret.buf  << endl;
  33.     }
  34. };
  35. Recv Listener::get_buffer()
  36. {
  37.     Recv temp;
  38.     pthread_mutex_lock( &verrou );
  39.     temp.nb =ret.nb;
  40.     strcpy(temp.buf, ret.buf);
  41.     cout << "sortie 2"  << endl << ret.nb << endl << ret.buf << endl;
  42.     pthread_mutex_unlock( &verrou );
  43.     return temp;
  44. };
  45. class Parseur
  46. {
  47.     public:
  48.     Parseur();
  49.     void make_parse(); // fct qui fait le parse !
  50.     void action();
  51.     private:
  52.     Listener *listen;
  53.     Recv buffer;
  54. };
  55. void Parseur::action()
  56. {
  57.     while (1)
  58.     {
  59.         buffer.nb = -1;
  60.         memset (buffer.buf, 0, sizeof (buffer.buf));
  61.         buffer = listen->get_buffer(); // on récup le Recv de l'objet listener (en gros la variable ret)
  62.         make_parse();
  63.     }
  64. };


 
ensuite on passe à ma fonction principale
pour créer mes threads, je me suis servi de la classe x_filament_amelioree trouvée ici :http://www.cppfrance.com/code.aspx?ID=19908
 

Code :
  1. ------Main------
  2. // initialisation des deux objets
  3. Listener ecouteur;
  4. Parseur decoupeur;
  5. decoupeur.set_listener(&ecouteur); //je passe l'adresse de l'objet Listener à l'objet Parseur,  
  6.                                                 //pour qu'il puisse récupérer le buffer !
  7. //lance un thread qui excute la methode Listener::lecture
  8. x_Filament_Ameliore<Listener> fil_ecouteur(&ecouteur, &Listener::lecture);
  9. //lance un thread qui excute la methode Parseur::action
  10. x_Filament_Ameliore<Parseur> fil_decoupeur(&decoupeur, &Parseur::action);
  11. // et là ça merde ! :D


 
au final, la lecture se déroule bien , j'ai bien le nombre d'octets lu et le contenu de mon buffer qui s'affiche au niveau de la sortie 1. Par contre sur la sortie 2, j'ai le nb d'octets, mais j'ai un truc vide pour ce qui est du buf.
j'ai essayé de voir si en exécutant mon get_buffer à la suite de ma ma boucle dans le Listener::lecture() et là tout marche nickel.
je comprends vraiment plus rien là, donc si quelqu'un peut m'aider !
 
merci d'avance
Wad

Reply

Marsh Posté le 24-07-2007 à 13:44:05   

Reply

Marsh Posté le 24-07-2007 à 15:25:42    

c'est quoi ce parser qui contient un listener ?
 
il n'ont rien a voir entre eux ces deux la ! le parser ne doit pas aller chercher les données a parser, on doit lui fournir (sous forme de stream pour bien faire)

Reply

Marsh Posté le 24-07-2007 à 16:31:06    

comment faire ?
 
oui, je débute un peu, donc j'ai du mal :d


Message édité par wadcyr8_197 le 24-07-2007 à 16:41:47
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed