如何从boost线程访问我的类实例?

时间:2009-12-01 16:51:45

标签: c++ boost multithreading

我有以下代码(这是一些半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作为第二个参数传递给bind将允许我从b()访问同一个实例 - 我不正确吗?

1 个答案:

答案 0 :(得分:6)

是的,这很有效。这是“真实”版本,实际上打印“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(),这非常重要。