perte d'adresses à l'appel d'une fonction

perte d'adresses à l'appel d'une fonction - C++ - Programmation

Marsh Posté le 31-07-2007 à 11:38:27    

Bonjour,
 
Je développe une application multi thread. Pour cela j'utilise la version win 32 des threads POSIX.
La fonction permettant de creer un thread a la signature suivante :
 

Code :
  1. int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg);


 
Ou le dernier argument "arg" est un pointeur donné en parametre a la fonction "start_routine" qui est appelée au lancement du thread.
Dans mon implementation, ma fonction "start_routine" caste ce pointeur pour le transformer en un pointeur sur une structure contenant tous les
parametres dont j'ai reellement besoin :
 

Code :
  1. struct ExecutionData
  2. {
  3. PipelineModule* pm;
  4. PipelineData* data;
  5. sem_t* lock;
  6. };
  7. void* launchExecute (void* data)
  8. {
  9. ExecutionData* ed2 = static_cast<ExecutionData*>(data);
  10. ed2->pm->execute (ed2->data);     // ERREUR, Access violation reading location 0x00000000
  11. sem_post (ed2->lock);
  12. return NULL;
  13. }


 
Et voici comment j'appelle la fonction lancant le thread :
 

Code :
  1. ...
  2. ExecutionData* ed1 = new ExecutionData ();
  3. ed1->pm = this;
  4. ed1->data = data;
  5. ed1->lock = lock;
  6. pthread_t thread;
  7. sem_wait (lock);
  8. pthread_create (&thread, NULL, &launchExecute, ed1);
  9. ...


 
Lorsque le programme arrive à la ligne (dans la fonction "launchExecute" )

Code :
  1. ed->pm->execute (ed2->data);

, l'erreur "Access violation reading location 0x00000000" est levée.
Lorsque je pose un breakpoint avant le lancement du thread, "ed1" contient les bonnes valeurs ! C'est à dire que les 3 pointeurs contenus dans "ed1" ont une valeur coherente:
ed1 = 0x003a6528
ed1->pm = 0x003a63b0
ed1->data = 0x003a6328
 
Lorsque je pose un breakpoint juste avant le caste dans "launchExecute", data contient la bonne adresse ! C'est à dire la même adresse que "ed1" avant le lancement du thread :
data = ed2 = 0x003a6528
 
Or après le caste, "ed2" contient toujours la bonne valeur mais son contenu a été écrasé ! les adresses sont :
ed2 = 0x003a6528
ed2->pm = 0x0000
ed2->data = 0x0000
ed2->lock = 0x0000
 
Je ne vois pas comment faire pour récupérer les données dont j'ai besoin !
Ou est l'erreur ?
Quelles seraient les alternatives ?
 
Merci d'avance pour vos reponses !

Reply

Marsh Posté le 31-07-2007 à 11:38:27   

Reply

Marsh Posté le 31-07-2007 à 11:45:27    

#
ExecutionData* ed1 = new ExecutionData ();
#
ed1->pm = this;
 
c'est qui this la ?

Reply

Marsh Posté le 31-07-2007 à 11:48:20    

C'est le pointeur sur l'objet qui lance le thread.
Cet objet contient une methode virtuelle pure "execute (PipelineData* pm)". Celle qui est appelée par la fonction "launchExecute" :  
ed2->pm->execute (ed2->data);
 
Mais ceci ne change pas grand chose, ce qui est vraiment surprenant, c'est que ma structure est déclarée en memoire centrale, pas sur la pile, tant qu'aucun delete n'est effectué, la memoire ne devrait pas revenir a zero !


Message édité par zbouirf le 31-07-2007 à 11:58:23
Reply

Marsh Posté le 11-01-2008 à 11:29:00    

La réponse s'il vous plais :)


---------------
“L'éducation est l'arme la plus puissante que l'on puisse utiliser pour changer le monde”
Reply

Marsh Posté le 11-01-2008 à 11:34:23    

Y en a pas, c'est un bug spécifique au code de zbouirf, y a des milliards de pthread qui tourne tous les jours sans problème.

Reply

Marsh Posté le 11-01-2008 à 11:36:26    

Merci.


---------------
“L'éducation est l'arme la plus puissante que l'on puisse utiliser pour changer le monde”
Reply

Sujets relatifs:

Leave a Replay

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