2015-01-06 67 views
0

我有以下两个函数,第一个崩溃但第二个运行正常。 我知道,对于第一个,run()返回时对象被销毁,但线程仍在执行它的work()函数,这可能会导致未定义的行为。在boost线程中调用一个类的成员函数

但为什么第二个工作?如果我们把这个对象包装在一个shared_ptr中,它会比那个线程活跃起来?

请赐教。谢谢。

void run() { 
    Object object(); 
    boost::thread t(&Object::work, &object); 
} 

void run() { 
    std::shared_ptr<Object> object_(new Object()); 
    boost::thread t(&Object::work, object); 
} 

回答

1

是的。按值存储参数。

这意味着共享指针的副本将一直存在,直到bind表达式失效。这样可以保持Object的状态。

有意思的是:boost::bind支持为shared_ptr<T>绑定成员函数的参数thisstd::bind没有此功能(还?)

+0

其中是绑定表达式? t(&Object :: work,&object)隐式调用bind? – jiawen

+0

@jiawen是的。对不起,这可能会更清晰。实际上,不需要使用'boost :: bind',但是'std :: thread'构造'std :: bind'是以相同的方式指定的。这也意味着如果你想绑定引用,你需要'boost :: ref(object)'(或'std :: ref(object)') – sehe

相关问题