来自另一个线程的shared_from_this()(成员线程函数)

时间:2011-01-21 20:07:58

标签: c++ multithreading shared-ptr boost-thread

在我的代码中,我使用boost::threads,我有一个通过名为fnThread()的成员函数运行线程的类。在这个fnThread()中,我想创建一个shared_from_this()并将其传递给有信号的听众。但是行boost::shared_ptr<foo> p = shared_from_this()抛出异常如下;

boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_weak_ptr> > at memory location 0x04c2f720.

违规命令是shared_from_this()。从另一个线程创建shared_from_this()或者我做错了是不合法的吗?任何帮助表示赞赏。谢谢!

PS:我打算将我的信号参数更改为普通指针,因为它不会影响我的结构。但我赞成shared_ptr&lt;&gt;我希望听到有关该决定的任何评论。也许这对于这种特殊情况来说是一个糟糕的选择。你有什么建议?

编辑:

这是一个简单的课程供您测试

class foo : public boost::enable_shared_from_this<foo>
{
public:
    int start()
    {
        foo_thread.reset(new boost::thread(boost::bind(&foo::fn_foo_thread, this)));

        return 0;
    }

    ~foo()
    {
        if (foo_thread->joinable())
            foo_thread->join();
    }

private:
    boost::scoped_ptr<boost::thread> foo_thread;

    void fn_foo_thread()
    {
        boost::shared_ptr<foo> p = shared_from_this();
        std::cout << "foo thread terminated. \n" << std::endl;
    }
};

4 个答案:

答案 0 :(得分:4)

shared_from_this可以在另一个线程中使用。如果没有bad_weak_ptrshared_ptr(顾名思义),则抛出this异常。很可能您的问题存在于代码的其他地方。

答案 1 :(得分:2)

正如@Sam Miller已经提到的,问题存在于其他地方。我可以想象你宣称fooscoped_ptr<foo>。通过这样做,shared_from_this不可能返回有效的共享指针,因为类型为boost::scoped_ptr的智能指针不能转移对象的所有权。这是您例外的原因。

答案 2 :(得分:0)

您可以考虑将boost::shared_ptr<>更改为boost::intrusive_ptr<>。主要区别在于boost::intrusive_ptr<>表明引用计数器存储在对象内(尽管可以将其存储在其他位置)。使用嵌入式引用计数器,您可以在构造函数中构造boost::intrusive_ptr<>,也可以随时从普通指针构造boost::intrusive_ptr<>(但不要在析构函数中使用{{1}})。

答案 3 :(得分:0)

在构造函数完成之前或析构函数启动之后,无法调用

shared_from_this()