我有以下代码(这是一些半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()
访问同一个实例 - 我不正确吗?
答案 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()
,这非常重要。