我有一种情况,一些对象必须作为线程回调函数的参数传递。对象是动态创建的,在传递给线程之后,不再需要/在该上下文中使用对象(在启动线程的方法中)。线程函数现在是应该拥有该对象的唯一上下文。
假设我想使用一些Boost智能指针(而不是将一个原始指针传递给线程),哪一个最适合?在这种情况下,最佳做法是什么?
我真正需要的是std::auto_ptr
,其移动语义通过复制构造函数。我相信这个智能指针完全适合这里,但由于众所周知的原因而被弃用(我不能依赖tr1
和C++11
指针;必须(并且想要)使用 Boost < / em>仅在必须在 Visual Studio 2008 和 2010 中编译的项目之间共享此代码时。
boost::shared_ptr
是一个选项 - 我可以通过值传递它,但认为它会过度使用。 有没有机会用boost::scoped_ptr
模拟移动语义(以安全的方式)?我不需要在这里引用计数,因为我没有在两个上下文之间共享对象,我只想转移对象从一个上下文到另一个上下文的所有权。
答案 0 :(得分:2)
您可以使用boost::interprocess::unique_ptr,或使用Boost.Move撰写自己的unique_ptr
。
boost::interprocess::unique_ptr
在其实现中使用Boost.Move,Boost.Move模拟C ++ 11移动语义C ++ 03。
答案 1 :(得分:0)
shared_ptr
适用于大多数情况(包括您的情况)。您可以使用此模式:
shared_ptr<MyT> param = .....;
thread = boost::thread(thread_routine, param);
param.reset();
...现在只有thread_routine保存对象。