2009-12-01 4 views
3

J'ai le code suivant (ce qui est un code semi-sudo, qui ne peut compiler):Comment puis-je accéder à mon instance de classe à partir d'un thread boost?

class FooBar { 
public: 
    void a(); 
    void b(); 
    boost::shared_ptr<boost::thread> m_thread; 
    std::string m_test; 
}; 

void FooBar::a() { 
    m_test = "Foo bar" 
    m_thread = shared_ptr<thread>(new thread(bind(&FooBar::b, this))); 
} 

void FooBar::b() { 
    cout << m_test; 
} 

Le code cout << test ne donne pas de sortie, car m_test est "" au lieu de "Foo bar". Pourquoi est-ce? Je pensais que le passage this comme le 2ème argument à bind me permettrait d'accéder à la même instance de b() - suis-je incorrecte?

Répondre

6

Oui, cela fonctionne. Voici la version "réelle", qui fait en version imprimée de fait "bar Foo":

#include <boost/make_shared.hpp> 
#include <boost/thread.hpp> 
#include <boost/bind.hpp> 

using namespace boost; 

struct FooBar { 
    void a(); 
    void b(); 
    shared_ptr<thread> m_thread; 
    std::string m_test; 
}; 

void FooBar::a() { 
    m_test = "Foo bar"; 
    m_thread = make_shared<thread>(bind(&FooBar::b, this)); 
} 

void FooBar::b() { 
    std::cout << m_test; 
} 

int main() { 
    FooBar fb; 
    fb.a(); 
    fb.m_thread->join(); 
    return 0; 
} 

Le code cout << test ne donne pas de sortie, car m_test est ""

Je soupçonne que c'est car l'objet était en train d'être détruit avant que le thread ne contourne l'évaluation de la variable membre. Notez le join(), c'est très important.

+0

Excellent merci pour l'affichage du code de travail! Et oui, j'ai mis un point d'arrêt dans le destructeur et hop, j'utilisais un type complet pour mon singleton statique, au lieu d'un pointeur - duh! Donc, une nouvelle instance était créée chaque fois que j'appelais le singleton. Fixe maintenant, merci encore pour votre code. –

Questions connexes