C++ 将lambda传递给std::thread并调用类方法

C++ 将lambda传递给std::thread并调用类方法,c++,multithreading,c++11,lambda,C++,Multithreading,C++11,Lambda,我在使用std::thread和lambdas时遇到了一些问题。我有一个方法TheMethod,我应该使用std::thread来并行化对同一类中方法的一些函数调用 我定义了一个lambda函数,并尝试按如下方式将其传递给我创建的std::thread实例: auto functor = [this](const Cursor& c, size_t& result) ->void {result = classMethod(c);}; size_t a; Curs

我在使用std::thread和lambdas时遇到了一些问题。我有一个方法TheMethod,我应该使用std::thread来并行化对同一类中方法的一些函数调用

我定义了一个lambda函数,并尝试按如下方式将其传递给我创建的std::thread实例:

auto functor = 
   [this](const Cursor& c, size_t& result) ->void {result = classMethod(c);};

size_t a;
Cursor cursor = someCursor();

std::thread t1(functor, cursor, a);

t1.join();
不幸的是,编译器给了我:

  /usr/include/c++/4.8/functional:1697:61: error: no type named ‘type’ in ‘class std::result_of<TheMethod...

/usr/include/c++/4.8/functional:1697:61:错误:在的'class std::result_'中没有名为'type'的类型您可以使用std::ref通过引用传递参数:

std::thread t1(functor, std::ref(cursor), std::ref(a))
您还可以通过lambda本身中的引用捕获参数:

size_t a;
Cursor cursor = someCursor();
std::thread t1([&] {a = classMethod(cursor);});
t1.join();

这是因为对象游标和a是通过值传递给线程的构造函数的。函子引用新创建的线程的本地副本,而不是您期望的对象


因此,正如“alexk7”所回答的,您应该使用std::ref,或者如果您想通过引用捕获它们,那么就说
std::threadt1(functor,std::ref(cursor),std::ref(a))t1
,并且主线程退出,那么在不使用std::ref的情况下通过引用调用类方法可能会有危险。