【问题标题】:Call member function of a class in boost thread在boost线程中调用类的成员函数
【发布时间】:2015-01-06 23:25:16
【问题描述】:

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

但是为什么第二个有效?如果我们将对象包装在 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);
}

【问题讨论】:

    标签: multithreading boost shared-ptr


    【解决方案1】:

    是的。 Bind 按值存储参数。

    这意味着共享指针的副本一直存在,直到绑定表达式不存在。这使对象保持在周围。

    有趣的说明:boost::bind 支持绑定到shared_ptr&lt;T&gt; 用于成员函数的this 参数。 std::bind 还没有这个功能(还没有?)

    【讨论】:

    • 绑定表达式在哪里? t(&Object::work, &object) 隐式调用绑定?
    • @jiawen 是的。对不起,那本来可以更清楚的。其实boost::bind不是必须的,但是std::thread构造std::bind也是一样的指定方式。这也意味着如果要绑定引用,需要boost::ref(object)(或std::ref(object)
    猜你喜欢
    • 2013-06-13
    • 2011-10-06
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 2015-11-14
    • 2011-10-03
    相关资源
    最近更新 更多