2012-10-23 2 views
0

Salut J'ai le code C++ suivant,Comment faire une fonction de classe dérivée comme routine de démarrage d'un thread?

je classe MyThread dans le fichier thread.h

class MyThread 
{ 
    public: 
     void start(); 
     virtual void* task() = 0; 
}; 

Je classe des travailleurs dans le fichier worker.h

class Worker : public MyThread 
{ 
    virtual ~Worker(); 
    virtual void* task(); // I have implementation in worker.cpp 
}; 

Ont utilisé pthread_create() dans le start() dans thread.cpp fichier pour créer un thread et je veux faire la routine task() définie dans le w orker.cpp comme routine de départ. Alors, comment puis-je faire ça? Que devrais-je transmettre en tant que paramètre à la routine de démarrage dans pthread_create?

J'ai essayé, mais il donne une erreur:

pthread_create(&(this->threadId),&(this->attr),(void *)task,NULL);       
+1

voulez-vous vraiment utiliser 11 C++ comme votre balise suggère? Dans ce cas, vous pouvez vider pthread et utiliser les threads intégrés. – KillianDS

+1

Le pointeur vers la fonction de classe-membre n'est en fait pas un pointeur sur la fonction. Et +1 pour les threads intégrés. – fasked

+0

@KillianDS, la dernière construction de mingw officielle, autant que je sache, construit avec le support de fil desibled. – Lol4t0

Répondre

2

Vous ne pouvez pas utiliser la fonction de membre comme une fonction de fil. Vous ne pouvez utiliser les fonctions gratuites ou fonctions membres statiques, mais vous pouvez passer l'argument vide arbitraire * à cette fonction et vous pouvez passer le pointeur à this comme cet argument, qui vous permet d'appeler la fonction de membre dans cette fonction:

class MyThread 
{ 
    public: 
     void start(); 
     virtual void* task() = 0; 

     static void * thread_routine(void* pthis) 
     { 
      MyThread* t = static_cast<MyThread*>(pthis); 
      t->task(); 
      return 0; 
     } 
}; 

Ensuite, vous lancez votre fil comme celui-ci

void MyThread::start() 
{ 
    pthread_create(&(this->threadId),&(this->attr),thread_routine, this); 
} 
0

Vous ne pouvez pas utiliser la tâche() comme routine de démarrage pour le fil, car il est fonction de membre au lieu d'une fonction libre, comme prévu signature void * (* start_routine) (void *). (En outre, il n'a pas le pointeur sur void paramètre)

Je voudrais juste créer un emballage et ont comme la routine de démarrage, quelque chose comme ceci:

void *wrapper(void *data) 
{ 
    Worker worker; 
    worker.task(); 

} 
Questions connexes