perte d'adresses à l'appel d'une fonction - C++ - Programmation
Marsh Posté le 31-07-2007 à 11:45:27
#
ExecutionData* ed1 = new ExecutionData ();
#
ed1->pm = this;
c'est qui this la ?
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 !
Marsh Posté le 11-01-2008 à 11:29:00
La réponse s'il vous plais
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.
Marsh Posté le 11-01-2008 à 11:36:26
Merci.
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 :
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 :
Et voici comment j'appelle la fonction lancant le thread :
Lorsque le programme arrive à la ligne (dans la fonction "launchExecute" )
, 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 !