以某种方式可以将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));
}
答案 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));