boost :: thread和std :: unique_ptr

时间:2011-06-18 19:35:59

标签: c++ multithreading boost c++11

以某种方式可以将std :: unique_ptr作为参数传递给boost :: thread构造函数吗?如果没有,最好的解决方法是什么?

一个小例子:

// errors: g++ uniqueptr_thread.cpp -std=c++0x

#include <iostream>
#include <memory>
#include <boost/thread.hpp>

class TestThread{
public:
  void operator()(std::unique_ptr<int> val){
    std::cout << "parameter: " << val << std::endl;
  }

};

int main(int argc, char* argv[]){

  std::unique_ptr<int> ptr(new int(5));

  boost::thread th( new TestThread(), std::move(ptr));

}

3 个答案:

答案 0 :(得分:2)

std :: unique_ptr,顾名思义, unique 只能有一个!

现在,如果您的线程函数采用std :: unique_ptr&amp;&amp;,并且您使用std :: move来移动线程函数中的参数,那么然后就可以传递std ::的unique_ptr。但是你的副本将是空的,因为你把它移到另一个线程。

如果std :: move不起作用,那么您的编译器或标准库可能存在错误。我想像在这样的线程之间转移所有权并不常见。 C ++ 11仍然相当新。

答案 1 :(得分:2)

这为我编译并运行:

#include <iostream>
#include <memory>
#include <thread>

class TestThread{
public:
  void operator()(std::unique_ptr<int> val){
    std::cout << "parameter: " << *val << std::endl;
  }
};

int main()
{

  std::unique_ptr<int> ptr(new int(5));

  std::thread th( TestThread(), std::move(ptr));
  th.join();

}

但它必须是C ++ 0x模式。我不知道升压移动仿真是否足以做到这一点。

答案 2 :(得分:0)

你确定你的问题是与unique_ptr有关吗?为什么你的例子使用new来创建你的仿函数?该行应该只读:

boost::thread th(TestThread(), std::move(ptr));