我尝试使用boost线程来多线程化我的一个应用程序。
我遇到问题的部分是boost::bind
。
以下是我要做的事情:
boost::bind(&Class::CalculateRT(i, i - 1), RT));
考虑:
RT is a TransformType
typedef std::pair<Eigen::Matrix3d, Eigen::Vector3d> TransformType;
而CalculateRT是一种方法:
TransformType Class::CalculateRT(int i, int j)
返回,如你所能,RT。
我想要的是能够绑定我的方法,得到它返回的内容(RT),然后用以下内容进行处理:
boost::thread MultiThreadingRTCalculation(boost::bind(&Class::CalculateRT(i, i - 1), RT));
我非常确定我通过将RT作为第二个参数来使用绑定错误。
在查看了其他一些StackOverflow问题后,我尝试了类似的内容:
boost::function<TransformType()> BoostFunction(boost::bind(&Class::CalculateRT(i, i - 1), RT));
所有这些都没有在VS2013中显示错误,直到编译时,弹出a:错误C2825:&#39; F&#39;:当后跟&#39; ::&#时必须是类或命名空间39;错误。
感谢您的帮助!
答案 0 :(得分:1)
你误解了bind
的作用。它束缚了争论。即它可以通过绑定Foo(x,y)
将Foo(3,y)
变为x=3
。您不绑定返回值。
相反,你需要的是一个lambda:[&RT, i](){RT = Class::CalculateRT(i, i - 1)
当然,如果CalculateRT
是非静态方法,那么您需要从某处获得Class
个对象。
使用:
TransformType RT;
auto boundFunction = [&RT, i](){RT = Class::CalculateRT(i, i - 1);
std::thread(boundFunction).detach(); // Doesn't wait for the assignment!
当然,如果你想依赖RT的结果,你可以join()
代替线程。但那时,你真的需要一个线程和一个绑定函数吗?
auto background = std::sync(std::launch::async, &Class::CalculateRT, i,i-1);
// Do stuff in the foreground.
RT = background.get();
答案 1 :(得分:0)
Class::CalculateRT(i, i - 1)
是一个函数调用,你试图获取调用本身的地址......
尝试类似:boost::bind(&Class::CalculateRT, i, i - 1)
(要绑定的地址,参数跟随)。
boost::ref(i)
。
这是静态方法吗?然后它需要绑定this
的值。
RT
将是绑定调用的结果:
boost::function<TransformType()> boundFunction = bind(........);
TransformType RT = boundFunction();