【问题标题】:Passing a Boost smart pointer to the thread function将 Boost 智能指针传递给线程函数
【发布时间】:2012-05-29 04:37:42
【问题描述】:

我遇到了一些对象必须作为线程回调函数的参数传递的情况。对象是动态创建的,并且在将其传递给线程之后,在该上下文中(在启动线程的方法中)不再需要/使用对象。线程函数现在是唯一应该拥有该对象的上下文。

假设我想使用一些 Boost 智能指针(而不是向线程传递原始指针),这里哪一个最合适?在这种情况下,最佳做法是什么?

我真正需要的是std::auto_ptr,它通过复制构造函数实现移动语义。我相信这个智能指针非常适合这里,但由于众所周知的原因它已被弃用(我不能依赖 tr1 和 C++11 指针;必须(并且想要)只使用 Boost因为此代码在必须在 Visual Studio 2008 和 2010 中编译的项目之间共享)。

boost::shared_ptr 是一个选项 - 我可以按值传递它,但认为它会矫枉过正。 有没有机会用boost::scoped_ptr 模拟移动语义(以安全的方式)?我不需要引用计数,因为我没有在两个上下文之间共享对象,我只想转移所有权将对象从一个上下文转移到另一个上下文。

【问题讨论】:

    标签: c++ multithreading boost smart-pointers


    【解决方案1】:

    您可以使用boost::interprocess::unique_ptr,或者使用Boost.Move 编写自己的unique_ptr。

    boost::interprocess::unique_ptr 在其实现中使用 Boost.Move,而 Boost.Move 模拟 C++11 移动语义 C++03。

    【讨论】:

    • 我现在去看看boost::interprocess::unique_ptr。感谢您的帮助。
    【解决方案2】:

    shared_ptr 适用于大多数情况(包括您的情况)。你可以使用这个模式:

    shared_ptr<MyT> param = .....;
    thread = boost::thread(thread_routine, param);
    param.reset();
    

    ...现在只有 thread_routine 持有该对象。

    【讨论】:

    • 是的,我知道这个解决方案,在我的情况下,我什至不需要调用reset,因为param 立即超出范围(该函数在线程一出现就返回创建)。但我想知道 Boost 是否有任何支持移动语义的非引用计数智能指针。看来boost::interprocess::unique_ptr是我想要的。
    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2011-03-20
    相关资源
    最近更新 更多