问题 将lambdas传递给std :: thread并调用类方法


我在使用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...

我在lambda定义中尝试了很多组合,并且调用了std :: thread构造函数,但总是得到相同的错误。包含了线程库,我也链接了pthread。

谢谢你的提示!


7359
2018-03-11 17:29


起源

说 std::thread t1(functor, std::ref(cursor), std::ref(a)); - Kerrek SB
确实,现在它汇编了。谢谢@KerrekSB! - user46317
你应该将anwer标记为有效,所以下次人们会发现这是一个很好的答案 - Gabriel
我怎样才能做到这一点?我只看到在Kerrek SBs答案旁边投票的选项。对不起,我是新来的。 - user46317


答案:


您可以使用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();

12
2017-07-04 22:29





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

因此,正如“alexk7”所回答的那样,你应该使用std :: ref,或者如果你想通过引用捕获它们


0
2017-10-02 10:01