在多线程库中转换未来
Converting future in multithreaded library
我正在使用 simple multithreaded library 来尝试了解基础知识。
该库有一个排队函数,如下所示:
auto enqueue(F&& f, Args&&... args)
-> std::future<typename std::result_of<F(Args...)>::type>;
并像这样存储函数:
std::queue< std::function<void()> > tasks;
有一个关于如何传递 Lambda 的示例,但我想传递成员变量。所以我创建了一个小对象:
Threadpool tp(4);
class myClass{
vector<std::future<int>> res;
public:
int compute(int i){
return 2 * i;
};
void update(){
for(int i = 0; i < 10; i++){
res.emplace_back(
// C2664 - 'std::future<int>::future(const std::future<int> &)':
// cannot convert argument 1 from 'std::future<_Rx>' to 'std::future<int> &&'
tp.enqueue(std::bind(&myClass::compute, this), i)
);
};
}
};
创建无参数函数有效。但即使是网站上的示例 lambda 也可以使用传递的参数:
tp.enqueue([](int answer) { return answer; }, 42);
我没有得到什么?
还有一个附带问题:当涉及到标准函数时,使用的优点是什么:
auto fn(...) -> return type
而不是:
return type fn(...)
缺少占位符:
tp.enqueue(std::bind(&myClass::compute, this, std::placeholders::_1), i);
或者干脆
tp.enqueue(std::bind(&myClass::compute, this, i));
或使用 lambda
tp.enqueue([=]() { this->compute(i); });
我正在使用 simple multithreaded library 来尝试了解基础知识。
该库有一个排队函数,如下所示:
auto enqueue(F&& f, Args&&... args)
-> std::future<typename std::result_of<F(Args...)>::type>;
并像这样存储函数:
std::queue< std::function<void()> > tasks;
有一个关于如何传递 Lambda 的示例,但我想传递成员变量。所以我创建了一个小对象:
Threadpool tp(4);
class myClass{
vector<std::future<int>> res;
public:
int compute(int i){
return 2 * i;
};
void update(){
for(int i = 0; i < 10; i++){
res.emplace_back(
// C2664 - 'std::future<int>::future(const std::future<int> &)':
// cannot convert argument 1 from 'std::future<_Rx>' to 'std::future<int> &&'
tp.enqueue(std::bind(&myClass::compute, this), i)
);
};
}
};
创建无参数函数有效。但即使是网站上的示例 lambda 也可以使用传递的参数:
tp.enqueue([](int answer) { return answer; }, 42);
我没有得到什么?
还有一个附带问题:当涉及到标准函数时,使用的优点是什么:
auto fn(...) -> return type
而不是:
return type fn(...)
缺少占位符:
tp.enqueue(std::bind(&myClass::compute, this, std::placeholders::_1), i);
或者干脆
tp.enqueue(std::bind(&myClass::compute, this, i));
或使用 lambda
tp.enqueue([=]() { this->compute(i); });