Как я могу получить доступ к своему экземпляру класса из потока поддержки? - PullRequest
3 голосов
/ 01 декабря 2009

У меня есть следующий код (это некоторый код полу-sudo, который может не скомпилироваться):

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;
}

Код cout << test не дает никакого вывода, потому что m_test равно "" вместо "Foo bar". Почему это? Я думал, что передача this в качестве 2-го аргумента bind позволит мне получить доступ к тому же экземпляру из b() - я ошибаюсь?

1 Ответ

6 голосов
/ 01 декабря 2009

Да, это работает. Вот «настоящая» версия, которая на самом деле печатает «Foo bar»:

#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;
}

Код cout << test не дает никакого вывода, потому что m_test равно ""

Я подозреваю, что это потому, что объект был уничтожен до того, как поток приступил к оценке переменной-члена. Обратите внимание на join(), это очень важно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...