Partage
  • Partager sur Facebook
  • Partager sur Twitter

Threads et passage de structure en argument

    20 juin 2008 à 19:37:09

    Bonjour cher zéros,
    Je suis entrain de travailler sur un générateur d'images fractales (Mandelbrot, Julia, Buddhabrot) afin de me faire la main sur opencv (Merci à Nohar pour son tuto en passant ;) ).
    Ayant fini la partie génération d'images, je me suis interessé à l'utilisation des threads, car le temps de calcul étant relativement important, leur utilisation pourrait etre interéssante.
    Voili voulu je vous expose mon problème:
    J'utilise la librairie pthreads.
    le lancement d'un thread demande un pointeur sur la fonction et un autre te type (void*) sur son (ses) arguments.
    Lorsqu'il y a plusieurs arguments, il faut passer un pointeur sur une structure pour les arguments.
    Mon problème se situe au passage du pointeur (de type void?) sur la structure des arguments.
    La partie erronnée de mon code est la suivante:

    pthread_t t1;
    	pthread_t t2;
    	struct arg
    	{
    		double minX;
    		double maxX;
    		double minY;
    		double maxY;
    		int w;
    		int h;
    		int iter;
    		int nb;
    	};
    	arg arg1 = {-2,2,-2,2,5000,5000,80,0};
    	arg arg2 = {-2,2,-2,2,5000,5000,80,1};
    	int status1(0),status2(0);
    	status1=pthread_create(&t1,NULL,&Mandelbrot, &arg1);
    	status2=pthread_create(&t2,NULL,&Mandelbrot, &arg2);
    


    Avec la fonction
    void Mandelbrot(double minX,double maxX,double minY,double maxY,int w, int h,int iter,int nb=0);
    

    et le lancement du thread:
    int pthread_create(pthread_t * thread, const pthread_attr_t * attr,void * (*start_routine)(void *), void *arg);
    


    Le compilateur me dit aimablement:
    invalid conversion from «void (*)(double, double, double, double, int, int, int, int)» to «void* (*)(void*)»


    Voila, mon problème se situe donc apparemment au passage de ma structure d'arguments à la fonction de lancement du thread. J'ai essayé en créant un pointeur sur une structure, et là il n'arrive pas à me créer le pointeur.
    Merci d'avance et bonne soirée à tous.

    Mirox
    • Partager sur Facebook
    • Partager sur Twitter
      20 juin 2008 à 19:50:35

      C'est l'adresse de la fonction Mandelbrot() qu'il est incapable de passer.
      Essaie de passer &Mandelbrot (avec une esperluette) au lieu de Mandelbrot.

      Ah, oui, et utilises les balises de code la prochaine fois.
      • Partager sur Facebook
      • Partager sur Twitter
        20 juin 2008 à 19:56:49

        Merci, en effet il demande un pointeur sur une fonction, j'ai corrigé ce détail, mais le problème persiste.
        • Partager sur Facebook
        • Partager sur Twitter
          20 juin 2008 à 19:59:26

          Ah, ouais, j'avais oublié un détail. Une fonction à utiliser dans un pthread doit OBLIGATOIREMENT prendre un seul paramètre de type void *. Tu devra avoir recours à un reinterpret_cast dans ta fonction...

          Donc:

          void * Mandelbrot(void * p)
          {
              arg * a = reinterpret_cast<arg *>(p);
              // utilisation des données contenues dans la valeur pointée par a
              pthread_exit(0);
          }
          
          • Partager sur Facebook
          • Partager sur Twitter
            20 juin 2008 à 20:43:21

            Ici, les threads te profiteront uniquement si ta machine est multi-coeurs. Tu y perdras sinon.
            • Partager sur Facebook
            • Partager sur Twitter
            C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

            Threads et passage de structure en argument

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown