2010-12-05 54 views
1

Je crée un nouveau boost::thread en utilisant boost::bind, et je le stocke dans un boost::shared_ptr.
Je passe une fonction et un argument au boost::thread, mais lorsque le thread est démarré, il n'appelle pas correctement le constructeur de copie pour l'argument de la fonction.Constructeur de copie non appelé lors de l'utilisation de boost :: bind, boost :: shared_ptr et boost :: thread ensemble

La méthode de création de fil J'utilise est un modèle Boost très commun, donc je ne pense pas que ce soit là le problème:

void myclass::myfunc() { 
    Workflow wfOriginal; 
    boost::shared_ptr<boost::thread>(
     new boost::thread(boost::bind(&myclass::anotherfunc, this, wfOriginal))); 
} 
// ... 
void myclass::anotherfunc(Workflow wfCopied) { 
    // Doing something 
} 

Je suis en train de copier le Workflow de myfunc() à anotherfunc().
Workflow contient une collection, donc j'ai fourni un constructeur de copie qui copie les éléments à l'intérieur de la collection existante au nouveau Workflow.

Malheureusement, lorsque anotherfunc() est appelée par le nouveau thread, la collection wfCopied est vide!
Je peux dire que l'objet Workflow a été partiellement copié, parce que d'autres membres comme les chaînes et les ints ont été copiés, mais pas les éléments de la collection.

J'ai vérifié que le constructeur de copie fonctionne correctement en testant avec ce code:

Workflow wf; 
// ... insert some elements into wf... 
Workflow wf1 = wf; 
// wf1 has the same elements 

Je tiens à souligner que mes tests ont montré que me Workflow EXEMPLAIRE constructeur fonctionne très bien.
Mais pour être complet, voici le constructeur de copie pour Workflow:

Workflow::Workflow(const Workflow& workflow) { 
    this->_id = workflow._id; 
    (this->_tasks).clear(); 
    Workflow::TaskCollectionConstIterator it; 
    for (it = (this->_tasks).begin(); it < (this->_tasks).end(); it++) 
     (this->_tasks).push_back(*it); 
} 

Quelqu'un peut-il me aider?

+0

Est-ce votre vrai code? l'utilisation de 'wf' à la fois comme nom de paramètre sur' myclass :: anotherFunc' et comme membre de la classe semble suspect. –

Répondre

2

Il semble que votre constructeur de copie est défectueux. Vous copiez de votre vecteur vide à votre vecteur. Ce qui aboutit à ne rien copier.

Je pense que vous voulez dire:

for (it = (workflow->_tasks).begin(); it < (workflow->_tasks).end(); it++) 
    (this->_tasks).push_back(*it); 
+0

Vous avez raison ... mais rien ne change ... – Andry

+0

OK, le problème était un autre, :) de toute façon, c'était un bug aussi !! MERCI pour votre aide ... quel bogue stupide ... ai-je vraiment fait une erreur aussi stupide? – Andry

+0

Je viens de compiler un code de test qui fait ce que vous essayez. Je reçois les résultats attendus. Il y a peut-être autre chose qui manque dans vos extraits de code. – tallganglyguy

0

Savez-vous quelle est la liste d'initialisation constructeur est? Et pourquoi exactement vous videz le conteneur dans le constructeur?

Workflow::Workflow(const Workflow& workflow): _id(workflow._id), 
    _tasks(workflow._tasks.begin(), workflow._tasks.end()) 
{}