我试图在c++的线程池上推送一堆lambda表达式。我知道c++中没有内置的线程池实现(或者至少这是我到目前为止读到的),所以我使用了我在https://github.com/vit-vit/ctpl找到的一个(我通过这个stackoverflow答案找到的)。当我有lambda表达式返回基本的c++类型(int
,double
等)时,我设法使用它,但是当我有一个返回自定义类实例的lambda表达式时,我无法让它工作。我做了一个简单的例子来说明我的问题,使用这个虚拟类Person
。
这是虚拟类Person
:
class Person {
private:
std::string name;
int age;
public:
Person(std::string name, int age) : name(std::move(name)), age(age) {}
std::string getName() const { return name; }
int getAge() const { return age; }
};
在我的main
文件中有这个函数它创建了Person
类的一个实例:
Person generatePersonInstance(std::string name, int age) {
return Person(std::move(name), age);
}
然后我只是尝试使用线程池(再次,我发现在https://github.com/vit-vit/ctpl)与lambda表达式返回一个Person
实例:
#include "ctpl_stl.h"
#include "Person.h"
int main() {
std::string myName = "myName";
int myAge = 100;
ctpl::thread_pool pool(4);
std::future<Person> f = pool.push([&myName, &myAge]{ generatePersonInstance(myName, myAge); });
return 0;
}
正如您所看到的,我试图在线程池上推送一个lambda表达式,该表达式将返回具有给定参数的Person
实例。这个想法是,在这段代码运行之后,我可以运行f.get()
从std::future<Person>
实例获取Person
实例本身。但我的问题是,这段代码不运行,我不知道为什么。在pool.push
部分,我得到错误:
没有匹配的成员函数来调用'push'候选模板忽略:替换失败[F = (lambda at)]D:
main.cpp:146:39), Rest = <>]:没有匹配的函数调用类型为'(lambda at D: main…候选人模板被忽略:替换失败[与F = (lambda at[D: main.cpp:146:39]:没有匹配的函数来调用对象类型'(lambda at D: main.cpp:146:39)'
我如何修复这个问题并使代码按我的意图工作?
我看到两个问题:
-
在lambda中缺少
Person
的return
。 -
看起来
ctpl::push
的参数必须接受int
的线程ID
std::future<Person> f = pool.push([&myName, &myAge](int id) {
return generatePersonInstance(myName, myAge);
});